From f9fc2a44cd64aa9f91b0c7e1c5bd54f6883c7dbf Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 22 Aug 2023 15:19:12 -0400 Subject: [PATCH 001/169] alphatyping for layout --- resources/lang/en/admin/reports/general.php | 6 ++++- resources/views/reports/custom.blade.php | 29 +++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/resources/lang/en/admin/reports/general.php b/resources/lang/en/admin/reports/general.php index 344d5c8743c0..6d0b0e005543 100644 --- a/resources/lang/en/admin/reports/general.php +++ b/resources/lang/en/admin/reports/general.php @@ -6,5 +6,9 @@ 'send_reminder' => 'Send reminder', 'reminder_sent' => 'Reminder sent', 'acceptance_deleted' => 'Acceptance request deleted', - 'acceptance_request' => 'Acceptance request' + 'acceptance_request' => 'Acceptance request', + 'save_template' => 'Save Template', + 'apply_template' => 'Apply Template', + 'select_template' => 'Select Template', + 'apply_and_generate' => 'Apply and Generate', ]; \ No newline at end of file diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index ff78f21686ba..6d7233dc82ed 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -7,8 +7,33 @@ @stop @section('header_right') - - {{ trans('general.back') }} +
+ + {{ trans('general.create') }} + + + + + {{ trans('admin/reports/general.apply_template') }} + + {{ trans('admin/reports/general.save_template') }}
@stop From c9fcc906fb7e70dc4a6cdd06836777f8d5509eeb Mon Sep 17 00:00:00 2001 From: akemidx Date: Wed, 23 Aug 2023 19:32:19 -0400 Subject: [PATCH 002/169] create saved reports migration --- app/Models/SavedReport.php | 11 +++++++ ...8_23_232739_create_saved_reports_table.php | 31 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 app/Models/SavedReport.php create mode 100644 database/migrations/2023_08_23_232739_create_saved_reports_table.php diff --git a/app/Models/SavedReport.php b/app/Models/SavedReport.php new file mode 100644 index 000000000000..330aa9c6457b --- /dev/null +++ b/app/Models/SavedReport.php @@ -0,0 +1,11 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('saved_reports'); + } +} From 78d589fe7827958a4a227b70fe2bad4661493fb2 Mon Sep 17 00:00:00 2001 From: akemidx Date: Thu, 24 Aug 2023 14:32:37 -0400 Subject: [PATCH 003/169] beginning of migrations --- app/Models/SavedReport.php | 12 ++++++++++++ .../2023_08_23_232739_create_saved_reports_table.php | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/app/Models/SavedReport.php b/app/Models/SavedReport.php index 330aa9c6457b..3f625dcab71b 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/SavedReport.php @@ -8,4 +8,16 @@ class SavedReport extends Model { use HasFactory; + + here be really sexy dragons + + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'options' => 'array', + ]; } diff --git a/database/migrations/2023_08_23_232739_create_saved_reports_table.php b/database/migrations/2023_08_23_232739_create_saved_reports_table.php index 603030cfe923..206588009533 100644 --- a/database/migrations/2023_08_23_232739_create_saved_reports_table.php +++ b/database/migrations/2023_08_23_232739_create_saved_reports_table.php @@ -15,7 +15,11 @@ public function up() { Schema::create('saved_reports', function (Blueprint $table) { $table->id(); + $table->integer('user_id')->nullable(); + $table->string('name'); + $table->json('options'); $table->timestamps(); + $table->index('user_id'); }); } From 734af87f2fba422a01a8bc88711146dbdd1d21d1 Mon Sep 17 00:00:00 2001 From: akemidx Date: Mon, 28 Aug 2023 19:26:31 -0400 Subject: [PATCH 004/169] template structuring --- app/Http/Controllers/ReportsController.php | 4 +- .../Controllers/SavedReportsController.php | 16 ++++ app/Models/SavedReport.php | 9 ++- resources/views/reports/custom.blade.php | 77 ++++++++++++------- routes/web.php | 2 + 5 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 app/Http/Controllers/SavedReportsController.php diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index c9a88ea0f173..a04cd8356b2e 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -11,6 +11,7 @@ use App\Models\CustomField; use App\Models\Depreciation; use App\Models\License; +use App\Models\SavedReport; use App\Models\Setting; use App\Notifications\CheckoutAssetNotification; use Carbon\Carbon; @@ -391,8 +392,9 @@ public function getCustomReport() { $this->authorize('reports.view'); $customfields = CustomField::get(); + $saved_reports = SavedReport::get(); - return view('reports/custom')->with('customfields', $customfields); + return view('reports/custom')->with('customfields', $customfields)->with('saved_reports', $saved_reports); } /** diff --git a/app/Http/Controllers/SavedReportsController.php b/app/Http/Controllers/SavedReportsController.php new file mode 100644 index 000000000000..b55838708f83 --- /dev/null +++ b/app/Http/Controllers/SavedReportsController.php @@ -0,0 +1,16 @@ +all()); + + } + +} diff --git a/app/Models/SavedReport.php b/app/Models/SavedReport.php index 3f625dcab71b..cd1cdd7e58d1 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/SavedReport.php @@ -9,9 +9,6 @@ class SavedReport extends Model { use HasFactory; - here be really sexy dragons - - /** * The attributes that should be cast. * @@ -20,4 +17,10 @@ class SavedReport extends Model protected $casts = [ 'options' => 'array', ]; + + protected $fillable = [ + 'user_id', + 'name', + 'options', + ]; } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 6d7233dc82ed..3a9e3a3a5c0f 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -7,33 +7,6 @@ @stop @section('header_right') -
- - {{ trans('general.create') }} - - - - - {{ trans('admin/reports/general.apply_template') }} - - {{ trans('admin/reports/general.save_template') }}
@stop @@ -43,7 +16,7 @@
- {{ Form::open(['method' => 'post', 'class' => 'form-horizontal']) }} + {{ Form::open(['method' => 'post', 'class' => 'form-horizontal', 'id' => 'custom-report-form']) }} {{csrf_field()}} @@ -386,6 +359,44 @@
{{ Form::close() }}
+ +
+ + {{ trans('admin/reports/general.apply_and_generate') }}
+
+ @csrf + + +
+
+ + {{ trans('admin/reports/general.select_template') }} + + + + {{ $fieldname = $report->name }} + +
@stop @@ -429,5 +440,15 @@ $("input:checkbox").prop('checked', $(this).prop("checked")); }); + $("#savetemplateform").submit(function(e) { + e.preventDefault(e); + let elements = Array.from(document.getElementById("custom-report-form").elements).map(item=>item.name); + console.log(elements); + + $("#savetemplateoptions").val(elements) + // set hidden input to variable + // submit the form + }); + @stop diff --git a/routes/web.php b/routes/web.php index 4bc8b3bb58c5..8da447916af9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -16,6 +16,7 @@ use App\Http\Controllers\ModalController; use App\Http\Controllers\ProfileController; use App\Http\Controllers\ReportsController; +use App\Http\Controllers\SavedReportsController; use App\Http\Controllers\SettingsController; use App\Http\Controllers\StatuslabelsController; use App\Http\Controllers\SuppliersController; @@ -356,6 +357,7 @@ )->name('reports/export/accessories'); Route::get('reports/custom', [ReportsController::class, 'getCustomReport'])->name('reports/custom'); Route::post('reports/custom', [ReportsController::class, 'postCustom']); + Route::post('reports/savedtemplate', [SavedReportsController::class, 'store'])->name('savedreports/store'); Route::get( 'reports/activity', From f1cc2c8d8b67e833d8affd084f545aeb0ba45a96 Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 29 Aug 2023 16:55:21 -0400 Subject: [PATCH 005/169] submitting form after capturing/formatting fixes --- .../Controllers/SavedReportsController.php | 1 + resources/views/reports/custom.blade.php | 76 ++++++++++--------- 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/SavedReportsController.php b/app/Http/Controllers/SavedReportsController.php index b55838708f83..a9917f5d96e9 100644 --- a/app/Http/Controllers/SavedReportsController.php +++ b/app/Http/Controllers/SavedReportsController.php @@ -9,6 +9,7 @@ class SavedReportsController extends Controller //a method to the madness public function store(Request $request) { + dd($request->all()); } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 3a9e3a3a5c0f..5944ec7e3873 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -361,41 +361,47 @@
- - {{ trans('admin/reports/general.apply_and_generate') }}
-
- @csrf - - -
-
- - {{ trans('admin/reports/general.select_template') }} + +
+
+ @csrf + + +
+
+
+ + {{ trans('admin/reports/general.select_template') }} - - - {{ $fieldname = $report->name }} - + + +
+ +{{-- {{ $fieldname = $report->name }}--}} +{{-- --}}
@@ -447,7 +453,7 @@ $("#savetemplateoptions").val(elements) // set hidden input to variable - // submit the form + e.currentTarget.submit(); }); From 45dbc028683e6fdf0a1ac0e9dca638ed948c61d2 Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 5 Sep 2023 15:01:20 -0400 Subject: [PATCH 006/169] save commit --- resources/views/reports/custom.blade.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 5944ec7e3873..7a38679057d2 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -452,6 +452,21 @@ console.log(elements); $("#savetemplateoptions").val(elements) + + let formElement = document.getElementById('custom-report-form') + + let inputsAsArray = Array.from(formElement.elements) + + inputsAsArray.map(function(item){ + // not a real method + if (item.isACheckbox()){ + return {name: item.name, type: checkbox, checked: item.checked}; + } + + if (item.isASelect){ + return {name:item.name, type: select, selected: [item.elements]} + } + }) // set hidden input to variable e.currentTarget.submit(); }); From e5792fd415e7bd0c1b3d258c495035ccd26b4c1d Mon Sep 17 00:00:00 2001 From: akemidx Date: Wed, 25 Oct 2023 14:42:23 -0400 Subject: [PATCH 007/169] api/savereports controller --- .../Api/SavedReportsController.php | 12 +++++++ .../Controllers/SavedReportsController.php | 1 + resources/views/reports/custom.blade.php | 31 ++++++++++--------- 3 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 app/Http/Controllers/Api/SavedReportsController.php diff --git a/app/Http/Controllers/Api/SavedReportsController.php b/app/Http/Controllers/Api/SavedReportsController.php new file mode 100644 index 000000000000..c4221ea8176a --- /dev/null +++ b/app/Http/Controllers/Api/SavedReportsController.php @@ -0,0 +1,12 @@ +all()); } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 7a38679057d2..78c07c519b60 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -375,7 +375,7 @@ -{{-- {{ $fieldname = $report->name }}--}} -{{-- --}} + + {{ $fieldname = $report->name }} + From 7a5faa96196c3ebc12c8b6461e8575d0ba6a5f4d Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 30 Oct 2023 12:03:50 -0700 Subject: [PATCH 008/169] Adjust margin on custom report page --- resources/views/reports/custom.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 78c07c519b60..f8427f646b36 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -14,7 +14,7 @@ @section('content')
-
+
{{ Form::open(['method' => 'post', 'class' => 'form-horizontal', 'id' => 'custom-report-form']) }} {{csrf_field()}} From 06186c9b12ff7cd1103e2b8ab41217147802a607 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 30 Oct 2023 16:30:53 -0700 Subject: [PATCH 009/169] WIP: Simply post the form to a different controller --- app/Http/Controllers/ReportsController.php | 1 + .../Controllers/SavedReportsController.php | 7 +-- resources/views/reports/custom.blade.php | 50 +++++++++++-------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index a04cd8356b2e..4b4db866ac3d 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -407,6 +407,7 @@ public function getCustomReport() */ public function postCustom(Request $request) { + dd('postCustom', $request->all()); ini_set('max_execution_time', env('REPORT_TIME_LIMIT', 12000)); //12000 seconds = 200 minutes $this->authorize('reports.view'); diff --git a/app/Http/Controllers/SavedReportsController.php b/app/Http/Controllers/SavedReportsController.php index 519e07b79b88..31b91f034741 100644 --- a/app/Http/Controllers/SavedReportsController.php +++ b/app/Http/Controllers/SavedReportsController.php @@ -6,13 +6,8 @@ class SavedReportsController extends Controller { - //a method to the madness public function store(Request $request) { - - - dd($request->all()); - + dd('saved reports', $request->all()); } - } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index f8427f646b36..94bdc3787912 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -16,7 +16,12 @@
- {{ Form::open(['method' => 'post', 'class' => 'form-horizontal', 'id' => 'custom-report-form']) }} + {{ Form::open([ + 'method' => 'post', + 'class' => 'form-horizontal', + 'id' => 'custom-report-form', + 'url' => '/reports/custom', + ]) }} {{csrf_field()}} @@ -449,27 +454,28 @@ $("#savetemplateform").submit(function(e) { e.preventDefault(e); - let elements = Array.from(document.getElementById("custom-report-form").elements).map(item=>item.name); - console.log(elements); - - $("#savetemplateoptions").val(elements) - - let formElement = document.getElementById('custom-report-form') - - let inputsAsArray = Array.from(formElement.elements) - - inputsAsArray.map(function(item){ - // not a real method - if (item.isACheckbox()){ - return {name: item.name, type: checkbox, checked: item.checked}; - } - - if (item.isASelect){ - return {name:item.name, type: select, selected: [item.elements]} - } - }) - // set hidden input to variable - e.currentTarget.submit(); + $('#custom-report-form').attr('action', '/reports/savedtemplate').submit() + // let elements = Array.from(document.getElementById("custom-report-form").elements).map(item=>item.name); + // console.log(elements); + // + // $("#savetemplateoptions").val(elements) + // + // let formElement = document.getElementById('custom-report-form') + // + // let inputsAsArray = Array.from(formElement.elements) + // + // inputsAsArray.map(function(item){ + // // not a real method + // if (item.isACheckbox()){ + // return {name: item.name, type: checkbox, checked: item.checked}; + // } + // + // if (item.isASelect){ + // return {name:item.name, type: select, selected: [item.elements]} + // } + // }) + // // set hidden input to variable + // e.currentTarget.submit(); }); From b7011d853a1a5fd0236a26b9e437bca786584d68 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 2 Nov 2023 17:10:50 -0700 Subject: [PATCH 010/169] WIP: add methods to restore settings from saved report --- app/Http/Controllers/ReportsController.php | 8 +- .../Controllers/SavedReportsController.php | 10 ++- app/Models/SavedReport.php | 26 ++++++ database/factories/SavedReportFactory.php | 21 +++++ resources/views/reports/custom.blade.php | 82 +++++++++---------- tests/Unit/SavedReportTest.php | 37 +++++++++ 6 files changed, 141 insertions(+), 43 deletions(-) create mode 100644 database/factories/SavedReportFactory.php create mode 100644 tests/Unit/SavedReportTest.php diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 4b4db866ac3d..d60e201e7735 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -394,7 +394,13 @@ public function getCustomReport() $customfields = CustomField::get(); $saved_reports = SavedReport::get(); - return view('reports/custom')->with('customfields', $customfields)->with('saved_reports', $saved_reports); + return view('reports/custom', [ + 'customfields' => $customfields, + 'saved_reports' => $saved_reports, + // @todo: temporary + 'savedReport' => $saved_reports->first(), + // 'savedReport' => new SavedReport, + ]); } /** diff --git a/app/Http/Controllers/SavedReportsController.php b/app/Http/Controllers/SavedReportsController.php index 31b91f034741..fcb9b546048d 100644 --- a/app/Http/Controllers/SavedReportsController.php +++ b/app/Http/Controllers/SavedReportsController.php @@ -2,12 +2,20 @@ namespace App\Http\Controllers; +use App\Models\SavedReport; use Illuminate\Http\Request; class SavedReportsController extends Controller { public function store(Request $request) { - dd('saved reports', $request->all()); + $savedReport = SavedReport::first(); + + $savedReport->options = $request->except('_token'); + + $savedReport->save(); + + // @todo: should this redirect elsewhere? + return redirect()->back(); } } diff --git a/app/Models/SavedReport.php b/app/Models/SavedReport.php index cd1cdd7e58d1..81c5b9a66c0d 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/SavedReport.php @@ -23,4 +23,30 @@ class SavedReport extends Model 'name', 'options', ]; + + public function checkmarkValue($property) + { + // Assuming we're using the null object pattern, + // return the default value if the object is not saved yet. + if (is_null($this->id)) { + return '1'; + } + + // Return the property's value if it exists + // and return the default value if not. + return $this->options[$property] ?? '0'; + } + + public function textValue($property) + { + // Assuming we're using the null object pattern, + // return the default value if the object is not saved yet. + if (is_null($this->id)) { + return ''; + } + + // Return the property's value if it exists + // and return the default value if not. + return $this->options[$property] ?? ''; + } } diff --git a/database/factories/SavedReportFactory.php b/database/factories/SavedReportFactory.php new file mode 100644 index 000000000000..72279bd3e5c1 --- /dev/null +++ b/database/factories/SavedReportFactory.php @@ -0,0 +1,21 @@ + $this->faker->word(), + 'options' => json_encode([]), + ]; + } +} diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 94bdc3787912..b9ce08a8c39b 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -40,147 +40,147 @@ @@ -190,32 +190,32 @@

{{ trans('general.checked_out_to') }} {{ trans('general.fields') }}:

@@ -228,7 +228,7 @@ @foreach ($customfields as $customfield) @@ -258,7 +258,7 @@
- +
@@ -266,9 +266,9 @@
- + to - +
@@ -324,13 +324,13 @@
diff --git a/tests/Unit/SavedReportTest.php b/tests/Unit/SavedReportTest.php new file mode 100644 index 000000000000..a99408a8465d --- /dev/null +++ b/tests/Unit/SavedReportTest.php @@ -0,0 +1,37 @@ +create([ + 'options' => [ + 'is_a_checkbox_value' => '1', + ], + ]); + + $this->assertEquals('1', $savedReport->checkmarkValue('is_a_checkbox_value')); + $this->assertEquals('0', $savedReport->checkmarkValue('non_existent_key')); + + $this->assertEquals('1', (new SavedReport)->checkmarkValue('is_a_checkbox_value')); + } + + public function testParsingTextValues() + { + $savedReport = SavedReport::factory()->create([ + 'options' => [ + 'is_a_text_value' => 'some text', + ], + ]); + + $this->assertEquals('some text', $savedReport->textValue('is_a_text_value')); + $this->assertEquals('', $savedReport->textValue('non_existent_key')); + + $this->assertEquals('', (new SavedReport)->textValue('is_a_text_value')); + } +} From 4f031149e83828bb9390ec5bd3ccdb2b9b2afc5c Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 30 Nov 2023 12:12:57 -0800 Subject: [PATCH 011/169] Scaffold a couple test cases --- tests/Unit/SavedReportTest.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/Unit/SavedReportTest.php b/tests/Unit/SavedReportTest.php index a99408a8465d..fad10abbb98c 100644 --- a/tests/Unit/SavedReportTest.php +++ b/tests/Unit/SavedReportTest.php @@ -34,4 +34,18 @@ public function testParsingTextValues() $this->assertEquals('', (new SavedReport)->textValue('is_a_text_value')); } + + public function testParsingSelectValues() + { + $this->markTestIncomplete(); + } + + public function testSelectValuesDoNotIncludeDeletedModels() + { + $this->markTestIncomplete(); + + // report saved with select option for a company (or whatever) + // company is deleted + // ensure company's id is not returned + } } From bca7f208a6c44640a19113809775a36f65c96697 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 30 Nov 2023 16:57:21 -0800 Subject: [PATCH 012/169] Implement restoring select values --- app/Models/SavedReport.php | 22 +++++++++- .../forms/edit/category-select.blade.php | 12 ++++++ .../forms/edit/company-select.blade.php | 7 ++++ .../forms/edit/department-select.blade.php | 12 ++++++ .../forms/edit/location-select.blade.php | 7 ++++ .../forms/edit/manufacturer-select.blade.php | 12 ++++++ .../forms/edit/model-select.blade.php | 12 ++++++ .../forms/edit/status-select.blade.php | 7 ++++ .../forms/edit/supplier-select.blade.php | 7 ++++ resources/views/reports/custom.blade.php | 18 ++++---- tests/Unit/SavedReportTest.php | 41 +++++++++++++++++-- 11 files changed, 143 insertions(+), 14 deletions(-) diff --git a/app/Models/SavedReport.php b/app/Models/SavedReport.php index 81c5b9a66c0d..afefc37ba323 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/SavedReport.php @@ -24,7 +24,7 @@ class SavedReport extends Model 'options', ]; - public function checkmarkValue($property) + public function checkmarkValue($property): string { // Assuming we're using the null object pattern, // return the default value if the object is not saved yet. @@ -37,7 +37,25 @@ public function checkmarkValue($property) return $this->options[$property] ?? '0'; } - public function textValue($property) + public function selectValue($property) + { + return $this->options[$property] ?? null; + } + + public function selectValues($property) + { + if (!isset($this->options[$property])) { + return null; + } + + if ($this->options[$property] === [null]) { + return null; + } + + return $this->options[$property]; + } + + public function textValue($property): string { // Assuming we're using the null object pattern, // return the default value if the object is not saved yet. diff --git a/resources/views/partials/forms/edit/category-select.blade.php b/resources/views/partials/forms/edit/category-select.blade.php index 684b8d76da8d..ea473d9c5e63 100644 --- a/resources/views/partials/forms/edit/category-select.blade.php +++ b/resources/views/partials/forms/edit/category-select.blade.php @@ -5,6 +5,18 @@
+ @isset ($selected) + @foreach ($selected as $company_id) + + @endforeach + @endisset @if ($company_id = Request::old($fieldname, (isset($item)) ? $item->{$fieldname} : ''))
From c3b53b28e3fbd3d818e7605c09135af9092a651b Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 11 Dec 2023 14:19:03 -0800 Subject: [PATCH 019/169] Allow saving custom reports --- app/Http/Controllers/ReportsController.php | 4 +- .../Controllers/SavedReportsController.php | 14 +++---- app/Models/SavedReport.php | 2 + app/Models/User.php | 6 +++ resources/views/reports/custom.blade.php | 38 +++++++++++++++---- 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index bf00e0ce2347..ba098d78a5c1 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -397,9 +397,7 @@ public function getCustomReport(Request $request) return view('reports/custom', [ 'customfields' => $customfields, 'saved_reports' => $saved_reports, - // @todo: temporary - 'savedReport' => $saved_reports->find($request->input('report')), - // 'savedReport' => new SavedReport, + 'savedReport' => $saved_reports->find($request->input('report')) ?? new SavedReport, ]); } diff --git a/app/Http/Controllers/SavedReportsController.php b/app/Http/Controllers/SavedReportsController.php index a28af2aa9efc..603cb76c08a4 100644 --- a/app/Http/Controllers/SavedReportsController.php +++ b/app/Http/Controllers/SavedReportsController.php @@ -2,21 +2,17 @@ namespace App\Http\Controllers; -use App\Models\SavedReport; use Illuminate\Http\Request; class SavedReportsController extends Controller { public function store(Request $request) { - // @todo: make this dynamic - $savedReport = SavedReport::first(); + $report = $request->user()->savedReports()->create([ + 'name' => $request->get('report_name'), + 'options' => $request->except(['_token', 'report_name']), + ]); - $savedReport->options = $request->except('_token'); - - $savedReport->save(); - - // @todo: redirect back with the saved report pre-populated? - return redirect()->back(); + return redirect()->route('reports/custom', ['report' => $report->id]); } } diff --git a/app/Models/SavedReport.php b/app/Models/SavedReport.php index 787e31e82554..2a5d59ff725e 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/SavedReport.php @@ -24,6 +24,8 @@ class SavedReport extends Model 'options', ]; + // @todo: add $rules + //we will need a bit to catch and store the name of the report. //for now the blip above is creating the name, but can be confusing if multiple are made at once diff --git a/app/Models/User.php b/app/Models/User.php index 98a3ec346ba2..95713fb655a6 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -14,6 +14,7 @@ use Illuminate\Contracts\Translation\HasLocalePreference; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\Access\Authorizable; use Illuminate\Notifications\Notifiable; @@ -329,6 +330,11 @@ public function licenses() return $this->belongsToMany(\App\Models\License::class, 'license_seats', 'assigned_to', 'license_id')->withPivot('id'); } + public function savedReports(): HasMany + { + return $this->hasMany(SavedReport::class); + } + /** * Establishes a count of all items assigned * diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 48138dc62fba..3c007af5006f 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -371,14 +371,11 @@ {{ trans('general.generate') }}
-
@csrf + {{-- this will be a box to name the report? --}}
@@ -445,7 +459,17 @@ $("#savetemplateform").submit(function(e) { e.preventDefault(e); - $('#custom-report-form').attr('action', '/reports/savedtemplate').submit() + + let form = $('#custom-report-form'); + + $('').attr({ + type: 'hidden', + name: 'report_name', + value: $('#report_name').val(), + }).appendTo(form); + + form.attr('action', '/reports/savedtemplate').submit(); + // let elements = Array.from(document.getElementById("custom-report-form").elements).map(item=>item.name); // console.log(elements); // From c9157dc55d236272a614a5a9c834df329c18576a Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 11 Dec 2023 14:20:33 -0800 Subject: [PATCH 020/169] Update docblock --- app/Http/Controllers/ReportsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index ba098d78a5c1..1df676067bc2 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -386,7 +386,7 @@ public function exportLicenseReport() * @author [A. Gianotto] [] * @see ReportsController::postCustomReport() method that generates the CSV * @since [v1.0] - * @return \Illuminate\Http\Response + * @return \Illuminate\Contracts\View\View */ public function getCustomReport(Request $request) { From c3845f439362261553c148915fea7c059195b76e Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 11 Dec 2023 14:29:33 -0800 Subject: [PATCH 021/169] Add tests around loading saved reports --- .../Feature/SavedReports/SavedReportsTest.php | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/Feature/SavedReports/SavedReportsTest.php diff --git a/tests/Feature/SavedReports/SavedReportsTest.php b/tests/Feature/SavedReports/SavedReportsTest.php new file mode 100644 index 000000000000..7c465beae8ff --- /dev/null +++ b/tests/Feature/SavedReports/SavedReportsTest.php @@ -0,0 +1,52 @@ +actingAs(User::factory()->canViewReports()->create()) + ->get(route('reports/custom')) + ->assertOk() + ->assertViewHas(['savedReport' => function (SavedReport $report) { + // the view should have an empty report by default + return $report->exists() === false; + }]); + } + + public function testCanLoadASavedCustomReport() + { + $user = User::factory()->canViewReports()->create(); + $savedReport = SavedReport::factory()->make(['name' => 'My Awesome Report']); + $user->savedReports()->save($savedReport); + + $this->actingAs($user) + ->get(route('reports/custom', ['report' => $savedReport->id])) + ->assertOk() + ->assertViewHas(['savedReport' => function (SavedReport $viewReport) use ($savedReport) { + return $viewReport->is($savedReport); + }]); + } + + public function testCanOnlySeeOwnSavedCustomReports() + { + $this->markTestIncomplete('potentially...'); + + // create saved reports for two users + // load the route('reports/custom') + // ensure the view only has the current users reports ($saved_reports) + } + + public function testCanSaveACustomReport() + { + $this->markTestIncomplete(); + } +} From 52028ddef2f400b8251b455d648ec4d3ddcc609c Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 11 Dec 2023 15:34:17 -0800 Subject: [PATCH 022/169] Add authorization to saving saved reports route --- .../Controllers/SavedReportsController.php | 2 ++ routes/web.php | 1 + .../Feature/SavedReports/SavedReportsTest.php | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/app/Http/Controllers/SavedReportsController.php b/app/Http/Controllers/SavedReportsController.php index 603cb76c08a4..ddc611539ce5 100644 --- a/app/Http/Controllers/SavedReportsController.php +++ b/app/Http/Controllers/SavedReportsController.php @@ -8,6 +8,8 @@ class SavedReportsController extends Controller { public function store(Request $request) { + $this->authorize('reports.view'); + $report = $request->user()->savedReports()->create([ 'name' => $request->get('report_name'), 'options' => $request->except(['_token', 'report_name']), diff --git a/routes/web.php b/routes/web.php index 8da447916af9..14d98d731813 100644 --- a/routes/web.php +++ b/routes/web.php @@ -357,6 +357,7 @@ )->name('reports/export/accessories'); Route::get('reports/custom', [ReportsController::class, 'getCustomReport'])->name('reports/custom'); Route::post('reports/custom', [ReportsController::class, 'postCustom']); + // @todo: change to saved-template? Route::post('reports/savedtemplate', [SavedReportsController::class, 'store'])->name('savedreports/store'); Route::get( diff --git a/tests/Feature/SavedReports/SavedReportsTest.php b/tests/Feature/SavedReports/SavedReportsTest.php index 7c465beae8ff..c95da4feafb0 100644 --- a/tests/Feature/SavedReports/SavedReportsTest.php +++ b/tests/Feature/SavedReports/SavedReportsTest.php @@ -49,4 +49,22 @@ public function testCanSaveACustomReport() { $this->markTestIncomplete(); } + + public function testSavingReportRequiresValidFields() + { + $this->markTestIncomplete(); + + $this->actingAs(User::factory()->canViewReports()->create()) + ->post(route('savedreports/store'), [ + // + ]) + ->assertSessionHasErrors('report_name'); + } + + public function testSavingReportRequiresCorrectPermission() + { + $this->actingAs(User::factory()->create()) + ->post(route('savedreports/store')) + ->assertForbidden(); + } } From b9cda8836393c607042457fb680eefc954816cc6 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 11 Dec 2023 16:20:17 -0800 Subject: [PATCH 023/169] Alphabetize saved reports list --- app/Http/Controllers/ReportsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 1df676067bc2..9ff7108280a0 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -392,7 +392,7 @@ public function getCustomReport(Request $request) { $this->authorize('reports.view'); $customfields = CustomField::get(); - $saved_reports = SavedReport::get(); + $saved_reports = SavedReport::orderBy('name')->get(); return view('reports/custom', [ 'customfields' => $customfields, From 89c47c18793906ec51fb9b031ff3707a002c3852 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 11 Dec 2023 16:20:36 -0800 Subject: [PATCH 024/169] Add validation for saving reports --- app/Http/Controllers/SavedReportsController.php | 7 +++++-- app/Models/SavedReport.php | 6 ++++++ resources/views/reports/custom.blade.php | 6 +++--- tests/Feature/SavedReports/SavedReportsTest.php | 13 +------------ 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/SavedReportsController.php b/app/Http/Controllers/SavedReportsController.php index ddc611539ce5..92687f323d8c 100644 --- a/app/Http/Controllers/SavedReportsController.php +++ b/app/Http/Controllers/SavedReportsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\SavedReport; use Illuminate\Http\Request; class SavedReportsController extends Controller @@ -10,9 +11,11 @@ public function store(Request $request) { $this->authorize('reports.view'); + $request->validate((new SavedReport)->getRules()); + $report = $request->user()->savedReports()->create([ - 'name' => $request->get('report_name'), - 'options' => $request->except(['_token', 'report_name']), + 'name' => $request->get('name'), + 'options' => $request->except(['_token', 'name']), ]); return redirect()->route('reports/custom', ['report' => $report->id]); diff --git a/app/Models/SavedReport.php b/app/Models/SavedReport.php index 2a5d59ff725e..dab8486a6e08 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/SavedReport.php @@ -4,10 +4,12 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Watson\Validating\ValidatingTrait; class SavedReport extends Model { use HasFactory; + use ValidatingTrait; /** * The attributes that should be cast. @@ -25,6 +27,10 @@ class SavedReport extends Model ]; // @todo: add $rules + protected $rules = [ + 'name' => 'required|unique:saved_reports,name', + 'options' => 'array', + ]; //we will need a bit to catch and store the name of the report. //for now the blip above is creating the name, but can be confusing if multiple are made at once diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 3c007af5006f..219fc79aa51b 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -375,7 +375,7 @@ @csrf - + {{-- this will be a box to name the report? --}}
-
- -
@csrf - {{-- this will be a box to name the report? --}} -
+
{{-- --}} {{-- {{ trans('admin/reports/general.select_template') }}--}} @@ -391,7 +385,7 @@ + + @if($saved_reports->first()!="") + + + + @endif + @push('js') - @endpush -
+
+ {{-- --}} + {{-- {{ trans('admin/reports/general.select_template') }}--}} + {{-- --}} + {{-- --}} + {{-- {!! Form::select('brand', array('1'=>'Text','2'=>'Logo','3'=>'Logo + Text'), old('brand', $setting->brand), array('class' => 'form-control select2', 'style'=>'width: 150px ;')) !!}--}} + + +{{-- @if($saved_reports->first()!="")--}} +{{-- --}} +{{--
--}} +{{-- @csrf--}} +{{-- --}} +{{-- --}} +{{-- --}} +{{--
--}} +{{-- --}} +{{-- @endif--}} + + @push('js') + + @endpush +
+ @endif
diff --git a/routes/web.php b/routes/web.php index f86d9b286de4..b4aafaf0111b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -359,7 +359,9 @@ Route::post('reports/custom', [ReportsController::class, 'postCustom']); // @todo: change to saved-template? Route::post('reports/savedtemplate', [SavedReportsController::class, 'store'])->name('savedreports/store'); - Route::post('report/savedtemplate', [SavedReportsController::class, 'update'])->name('savedreports/update'); + // @todo: starting the process of adding "-" to saved-template... + Route::get('reports/saved-templates/{reportId}/edit', [SavedReportsController::class, 'edit'])->name('saved-templates.edit'); + Route::put('report/savedtemplate', [SavedReportsController::class, 'update'])->name('savedreports/update'); Route::get( 'reports/activity', From 9fcb1a2d0e9459fb83d44aab177aa64bacf52a46 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Mon, 18 Dec 2023 12:55:48 -0800 Subject: [PATCH 033/169] Rename SavedReport to ReportTemplate --- ...ller.php => ReportTemplatesController.php} | 18 +- app/Http/Controllers/ReportsController.php | 8 +- .../{SavedReport.php => ReportTemplate.php} | 4 +- app/Models/User.php | 4 +- ...tFactory.php => ReportTemplateFactory.php} | 2 +- ..._232739_create_report_templates_table.php} | 6 +- resources/views/reports/custom.blade.php | 167 +++++++++--------- routes/web.php | 10 +- .../ReportTemplateTest.php} | 32 ++-- ...dReportTest.php => ReportTemplateTest.php} | 18 +- 10 files changed, 131 insertions(+), 138 deletions(-) rename app/Http/Controllers/{SavedReportsController.php => ReportTemplatesController.php} (66%) rename app/Models/{SavedReport.php => ReportTemplate.php} (96%) rename database/factories/{SavedReportFactory.php => ReportTemplateFactory.php} (88%) rename database/migrations/{2023_08_23_232739_create_saved_reports_table.php => 2023_08_23_232739_create_report_templates_table.php} (77%) rename tests/Feature/{SavedReports/SavedReportsTest.php => ReportTemplates/ReportTemplateTest.php} (58%) rename tests/Unit/{SavedReportTest.php => ReportTemplateTest.php} (88%) diff --git a/app/Http/Controllers/SavedReportsController.php b/app/Http/Controllers/ReportTemplatesController.php similarity index 66% rename from app/Http/Controllers/SavedReportsController.php rename to app/Http/Controllers/ReportTemplatesController.php index 487ded803a84..5671cef24469 100644 --- a/app/Http/Controllers/SavedReportsController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -3,18 +3,18 @@ namespace App\Http\Controllers; use App\Models\CustomField; -use App\Models\SavedReport; +use App\Models\ReportTemplate; use Illuminate\Http\Request; -class SavedReportsController extends Controller +class ReportTemplatesController extends Controller { public function store(Request $request) { $this->authorize('reports.view'); - $request->validate((new SavedReport)->getRules()); + $request->validate((new ReportTemplate)->getRules()); - $report = $request->user()->savedReports()->create([ + $report = $request->user()->reportTemplates()->create([ 'name' => $request->get('name'), 'options' => $request->except(['_token', 'name']), ]); @@ -24,19 +24,19 @@ public function store(Request $request) public function edit(Request $request, $reportId) { - $report = SavedReport::findOrFail($reportId); + $report = ReportTemplate::findOrFail($reportId); return view('reports/custom', [ 'customfields' => CustomField::get(), - 'savedReport' => $report, + 'reportTemplate' => $report, ]); } public function update(Request $request) { - $this->authorize('update',SavedReport::class); + $this->authorize('update',ReportTemplate::class); - if(is_null($reportid = SavedReport::find($request))) + if(is_null($reportid = ReportTemplate::find($request))) { return redirect()->route('reports/custom'); } @@ -44,7 +44,7 @@ public function update(Request $request) $request->validate()->report->id->getRules(); - $report = $request->user()->savedReports()->edit([ + $report = $request->user()->reportTemplates()->edit([ 'name' => $request->get('name'), 'options' => $request->except(['token','name']), ]); diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 9ff7108280a0..864e88965325 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -11,7 +11,7 @@ use App\Models\CustomField; use App\Models\Depreciation; use App\Models\License; -use App\Models\SavedReport; +use App\Models\ReportTemplate; use App\Models\Setting; use App\Notifications\CheckoutAssetNotification; use Carbon\Carbon; @@ -392,12 +392,12 @@ public function getCustomReport(Request $request) { $this->authorize('reports.view'); $customfields = CustomField::get(); - $saved_reports = SavedReport::orderBy('name')->get(); + $report_templates = ReportTemplate::orderBy('name')->get(); return view('reports/custom', [ 'customfields' => $customfields, - 'saved_reports' => $saved_reports, - 'savedReport' => $saved_reports->find($request->input('report')) ?? new SavedReport, + 'report_templates' => $report_templates, + 'reportTemplate' => $report_templates->find($request->input('report')) ?? new ReportTemplate, ]); } diff --git a/app/Models/SavedReport.php b/app/Models/ReportTemplate.php similarity index 96% rename from app/Models/SavedReport.php rename to app/Models/ReportTemplate.php index 806c9dab99a6..6ea8dd95abea 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/ReportTemplate.php @@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model; use Watson\Validating\ValidatingTrait; -class SavedReport extends Model +class ReportTemplate extends Model { use HasFactory; use ValidatingTrait; @@ -28,7 +28,7 @@ class SavedReport extends Model // @todo: add $rules protected $rules = [ - 'name' => 'required|unique:saved_reports,name', + 'name' => 'required|unique:report_templates,name', 'options' => 'array', ]; diff --git a/app/Models/User.php b/app/Models/User.php index 95713fb655a6..8355189b1483 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -330,9 +330,9 @@ public function licenses() return $this->belongsToMany(\App\Models\License::class, 'license_seats', 'assigned_to', 'license_id')->withPivot('id'); } - public function savedReports(): HasMany + public function reportTemplates(): HasMany { - return $this->hasMany(SavedReport::class); + return $this->hasMany(ReportTemplate::class); } /** diff --git a/database/factories/SavedReportFactory.php b/database/factories/ReportTemplateFactory.php similarity index 88% rename from database/factories/SavedReportFactory.php rename to database/factories/ReportTemplateFactory.php index 72279bd3e5c1..1ece94e410c8 100644 --- a/database/factories/SavedReportFactory.php +++ b/database/factories/ReportTemplateFactory.php @@ -4,7 +4,7 @@ use Illuminate\Database\Eloquent\Factories\Factory; -class SavedReportFactory extends Factory +class ReportTemplateFactory extends Factory { /** * Define the model's default state. diff --git a/database/migrations/2023_08_23_232739_create_saved_reports_table.php b/database/migrations/2023_08_23_232739_create_report_templates_table.php similarity index 77% rename from database/migrations/2023_08_23_232739_create_saved_reports_table.php rename to database/migrations/2023_08_23_232739_create_report_templates_table.php index 206588009533..31615b6fe405 100644 --- a/database/migrations/2023_08_23_232739_create_saved_reports_table.php +++ b/database/migrations/2023_08_23_232739_create_report_templates_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class CreateSavedReportsTable extends Migration +class CreateReportTemplatesTable extends Migration { /** * Run the migrations. @@ -13,7 +13,7 @@ class CreateSavedReportsTable extends Migration */ public function up() { - Schema::create('saved_reports', function (Blueprint $table) { + Schema::create('report_templates', function (Blueprint $table) { $table->id(); $table->integer('user_id')->nullable(); $table->string('name'); @@ -30,6 +30,6 @@ public function up() */ public function down() { - Schema::dropIfExists('saved_reports'); + Schema::dropIfExists('report_templates'); } } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 29a9511bd9d7..016020a508fb 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -28,31 +28,31 @@

- @if ($savedReport->exists && request()->routeIs('saved-templates.edit')) - Updating: {{ $savedReport->name }} - @elseif($savedReport->exists) - Saved Template: {{ $savedReport->name }} + @if ($reportTemplate->exists && request()->routeIs('report-templates.edit')) + Updating: {{ $reportTemplate->name }} + @elseif($reportTemplate->exists) + Saved Template: {{ $reportTemplate->name }} @else {{ trans('general.customize_report') }} @endif

- @if ($savedReport->exists && request()->routeIs('saved-templates.edit')) + @if ($reportTemplate->exists && request()->routeIs('report-templates.edit'))
{{-- todo --}} -
+ id) }}"> @csrf @method('PUT') - +
- @elseif ($savedReport->exists) + @elseif ($reportTemplate->exists)
@@ -236,32 +236,32 @@ class="actions btn btn-danger btn-sm delete-asset"

{{ trans('general.checked_out_to') }} {{ trans('general.fields') }}:

@@ -274,7 +274,7 @@ class="actions btn btn-danger btn-sm delete-asset" @foreach ($customfields as $customfield) @@ -290,21 +290,21 @@ class="actions btn btn-danger btn-sm delete-asset"
- @include ('partials.forms.edit.company-select', ['translated_name' => trans('general.company'),'multiple' => 'true', 'fieldname' => 'by_company_id[]', 'hide_new' => 'true', 'selected' => $savedReport->selectValues('by_company_id')]) - @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'multiple' => 'true', 'fieldname' => 'by_location_id[]', 'hide_new' => 'true', 'selected' => $savedReport->selectValues('by_location_id')]) - @include ('partials.forms.edit.location-select', ['translated_name' => trans('admin/hardware/form.default_location'), 'multiple' => 'true', 'fieldname' => 'by_rtd_location_id[]', 'hide_new' => 'true', 'selected' => $savedReport->selectValues('by_rtd_location_id')]) - @include ('partials.forms.edit.department-select', ['translated_name' => trans('general.department'), 'fieldname' => 'by_dept_id', 'hide_new' => 'true', 'selected' => $savedReport->selectValue('by_dept_id')]) - @include ('partials.forms.edit.supplier-select', ['translated_name' => trans('general.supplier'), 'fieldname' => 'by_supplier_id[]', 'multiple' => 'true', 'hide_new' => 'true', 'selected' => $savedReport->selectValues('by_supplier_id')]) - @include ('partials.forms.edit.model-select', ['translated_name' => trans('general.asset_model'), 'fieldname' => 'by_model_id[]', 'multiple' => 'true', 'hide_new' => 'true', 'selected' => $savedReport->selectValues('by_model_id')]) - @include ('partials.forms.edit.manufacturer-select', ['translated_name' => trans('general.manufacturer'), 'fieldname' => 'by_manufacturer_id', 'hide_new' => 'true', 'selected' => $savedReport->selectValue('by_manufacturer_id')]) - @include ('partials.forms.edit.category-select', ['translated_name' => trans('general.category'), 'fieldname' => 'by_category_id', 'hide_new' => 'true', 'category_type' => 'asset', 'selected' => $savedReport->selectValue('by_category_id')]) - @include ('partials.forms.edit.status-select', ['translated_name' => trans('admin/hardware/form.status'), 'fieldname' => 'by_status_id[]', 'multiple' => 'true', 'hide_new' => 'true', 'selected' => $savedReport->selectValues('by_status_id')]) + @include ('partials.forms.edit.company-select', ['translated_name' => trans('general.company'),'multiple' => 'true', 'fieldname' => 'by_company_id[]', 'hide_new' => 'true', 'selected' => $reportTemplate->selectValues('by_company_id')]) + @include ('partials.forms.edit.location-select', ['translated_name' => trans('general.location'), 'multiple' => 'true', 'fieldname' => 'by_location_id[]', 'hide_new' => 'true', 'selected' => $reportTemplate->selectValues('by_location_id')]) + @include ('partials.forms.edit.location-select', ['translated_name' => trans('admin/hardware/form.default_location'), 'multiple' => 'true', 'fieldname' => 'by_rtd_location_id[]', 'hide_new' => 'true', 'selected' => $reportTemplate->selectValues('by_rtd_location_id')]) + @include ('partials.forms.edit.department-select', ['translated_name' => trans('general.department'), 'fieldname' => 'by_dept_id', 'hide_new' => 'true', 'selected' => $reportTemplate->selectValue('by_dept_id')]) + @include ('partials.forms.edit.supplier-select', ['translated_name' => trans('general.supplier'), 'fieldname' => 'by_supplier_id[]', 'multiple' => 'true', 'hide_new' => 'true', 'selected' => $reportTemplate->selectValues('by_supplier_id')]) + @include ('partials.forms.edit.model-select', ['translated_name' => trans('general.asset_model'), 'fieldname' => 'by_model_id[]', 'multiple' => 'true', 'hide_new' => 'true', 'selected' => $reportTemplate->selectValues('by_model_id')]) + @include ('partials.forms.edit.manufacturer-select', ['translated_name' => trans('general.manufacturer'), 'fieldname' => 'by_manufacturer_id', 'hide_new' => 'true', 'selected' => $reportTemplate->selectValue('by_manufacturer_id')]) + @include ('partials.forms.edit.category-select', ['translated_name' => trans('general.category'), 'fieldname' => 'by_category_id', 'hide_new' => 'true', 'category_type' => 'asset', 'selected' => $reportTemplate->selectValue('by_category_id')]) + @include ('partials.forms.edit.status-select', ['translated_name' => trans('admin/hardware/form.status'), 'fieldname' => 'by_status_id[]', 'multiple' => 'true', 'hide_new' => 'true', 'selected' => $reportTemplate->selectValues('by_status_id')])
- +
@@ -312,9 +312,9 @@ class="actions btn btn-danger btn-sm delete-asset"
- + to - +
@@ -322,9 +322,9 @@ class="actions btn btn-danger btn-sm delete-asset"
- + to - +
@@ -332,9 +332,9 @@ class="actions btn btn-danger btn-sm delete-asset"
- + to - +
@@ -342,9 +342,9 @@ class="actions btn btn-danger btn-sm delete-asset"
- + to - +
@@ -352,9 +352,9 @@ class="actions btn btn-danger btn-sm delete-asset"
- + to - +
@@ -362,36 +362,36 @@ class="actions btn btn-danger btn-sm delete-asset"
- + to - +
@@ -411,12 +411,12 @@ class="actions btn btn-danger btn-sm delete-asset"
- @if (! request()->routeIs('saved-templates.edit')) + @if (! request()->routeIs('report-templates.edit'))
-
+ @csrf - {{--this means that the name of a loaded report is in the input box. could lead to confusion with update--}} + {{--this means that the name of a loaded report is in the input box. could lead to confusion with update--}} @@ -424,11 +424,6 @@ class="actions btn btn-danger btn-sm delete-asset"
- {{-- --}} - {{-- {{ trans('admin/reports/general.select_template') }}--}} - {{-- --}} - {{-- --}} - {{-- {!! Form::select('brand', array('1'=>'Text','2'=>'Logo','3'=>'Logo + Text'), old('brand', $setting->brand), array('class' => 'form-control select2', 'style'=>'width: 150px ;')) !!}--}} @@ -447,10 +442,10 @@ class="form-control select2" {{-- --}} -{{-- --}} +{{-- --}} {{-- @csrf--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- --}} @@ -529,7 +524,7 @@ class="form-control select2" value: $('#name').val(), }).appendTo(form); - form.attr('action', '/reports/savedtemplate').submit(); + form.attr('action', '{{ route('report-templates.store') }}').submit(); }); diff --git a/routes/web.php b/routes/web.php index b4aafaf0111b..d23bf83e4604 100644 --- a/routes/web.php +++ b/routes/web.php @@ -16,7 +16,7 @@ use App\Http\Controllers\ModalController; use App\Http\Controllers\ProfileController; use App\Http\Controllers\ReportsController; -use App\Http\Controllers\SavedReportsController; +use App\Http\Controllers\ReportTemplatesController; use App\Http\Controllers\SettingsController; use App\Http\Controllers\StatuslabelsController; use App\Http\Controllers\SuppliersController; @@ -357,11 +357,9 @@ )->name('reports/export/accessories'); Route::get('reports/custom', [ReportsController::class, 'getCustomReport'])->name('reports/custom'); Route::post('reports/custom', [ReportsController::class, 'postCustom']); - // @todo: change to saved-template? - Route::post('reports/savedtemplate', [SavedReportsController::class, 'store'])->name('savedreports/store'); - // @todo: starting the process of adding "-" to saved-template... - Route::get('reports/saved-templates/{reportId}/edit', [SavedReportsController::class, 'edit'])->name('saved-templates.edit'); - Route::put('report/savedtemplate', [SavedReportsController::class, 'update'])->name('savedreports/update'); + Route::post('reports/saved-templates', [ReportTemplatesController::class, 'store'])->name('report-templates.store'); + Route::get('reports/saved-templates/{reportId}/edit', [ReportTemplatesController::class, 'edit'])->name('report-templates.edit'); + Route::post('report/saved-templates/{reportId}', [ReportTemplatesController::class, 'update'])->name('report-templates.update'); Route::get( 'reports/activity', diff --git a/tests/Feature/SavedReports/SavedReportsTest.php b/tests/Feature/ReportTemplates/ReportTemplateTest.php similarity index 58% rename from tests/Feature/SavedReports/SavedReportsTest.php rename to tests/Feature/ReportTemplates/ReportTemplateTest.php index c68e99688d51..92a6ac696d09 100644 --- a/tests/Feature/SavedReports/SavedReportsTest.php +++ b/tests/Feature/ReportTemplates/ReportTemplateTest.php @@ -1,13 +1,13 @@ actingAs(User::factory()->canViewReports()->create()) ->get(route('reports/custom')) ->assertOk() - ->assertViewHas(['savedReport' => function (SavedReport $report) { + ->assertViewHas(['reportTemplate' => function (ReportTemplate $report) { // the view should have an empty report by default return $report->exists() === false; }]); @@ -25,14 +25,14 @@ public function testCanLoadCustomReportPage() public function testCanLoadASavedCustomReport() { $user = User::factory()->canViewReports()->create(); - $savedReport = SavedReport::factory()->make(['name' => 'My Awesome Report']); - $user->savedReports()->save($savedReport); + $reportTemplate = ReportTemplate::factory()->make(['name' => 'My Awesome Report']); + $user->reportTemplates()->save($reportTemplate); $this->actingAs($user) - ->get(route('reports/custom', ['report' => $savedReport->id])) + ->get(route('reports/custom', ['report' => $reportTemplate->id])) ->assertOk() - ->assertViewHas(['savedReport' => function (SavedReport $viewReport) use ($savedReport) { - return $viewReport->is($savedReport); + ->assertViewHas(['reportTemplate' => function (ReportTemplate $viewReport) use ($reportTemplate) { + return $viewReport->is($reportTemplate); }]); } @@ -41,26 +41,26 @@ public function testCanSaveACustomReport() $user = User::factory()->canViewReports()->create(); $this->actingAs($user) - ->post(route('savedreports/store'), [ + ->post(route('report-templates.store'), [ 'name' => 'My Awesome Report', 'company' => '1', 'by_company_id' => ['1', '2'], ]) ->assertRedirect(); - $report = $user->savedReports->first(function ($report) { + $template = $user->reportTemplates->first(function ($report) { return $report->name === 'My Awesome Report'; }); - $this->assertNotNull($report); - $this->assertEquals('1', $report->options['company']); - $this->assertEquals(['1', '2'], $report->options['by_company_id']); + $this->assertNotNull($template); + $this->assertEquals('1', $template->options['company']); + $this->assertEquals(['1', '2'], $template->options['by_company_id']); } public function testSavingReportRequiresValidFields() { $this->actingAs(User::factory()->canViewReports()->create()) - ->post(route('savedreports/store'), [ + ->post(route('report-templates.store'), [ // ]) ->assertSessionHasErrors('name'); @@ -69,7 +69,7 @@ public function testSavingReportRequiresValidFields() public function testSavingReportRequiresCorrectPermission() { $this->actingAs(User::factory()->create()) - ->post(route('savedreports/store')) + ->post(route('report-templates.store')) ->assertForbidden(); } } diff --git a/tests/Unit/SavedReportTest.php b/tests/Unit/ReportTemplateTest.php similarity index 88% rename from tests/Unit/SavedReportTest.php rename to tests/Unit/ReportTemplateTest.php index 02b8876dd403..7af41710c71f 100644 --- a/tests/Unit/SavedReportTest.php +++ b/tests/Unit/ReportTemplateTest.php @@ -2,14 +2,14 @@ namespace Tests\Unit; -use App\Models\SavedReport; +use App\Models\ReportTemplate; use Tests\TestCase; -class SavedReportTest extends TestCase +class ReportTemplateTest extends TestCase { public function testParsingCheckmarkValue() { - $savedReport = SavedReport::factory()->create([ + $savedReport = ReportTemplate::factory()->create([ 'options' => [ 'is_a_checkbox_field' => '1', ], @@ -18,12 +18,12 @@ public function testParsingCheckmarkValue() $this->assertEquals('1', $savedReport->checkmarkValue('is_a_checkbox_field')); $this->assertEquals('0', $savedReport->checkmarkValue('non_existent_key')); - $this->assertEquals('1', (new SavedReport)->checkmarkValue('is_a_checkbox_field')); + $this->assertEquals('1', (new ReportTemplate)->checkmarkValue('is_a_checkbox_field')); } public function testParsingTextValue() { - $savedReport = SavedReport::factory()->create([ + $savedReport = ReportTemplate::factory()->create([ 'options' => [ 'is_a_text_field' => 'some text', ], @@ -32,12 +32,12 @@ public function testParsingTextValue() $this->assertEquals('some text', $savedReport->textValue('is_a_text_field')); $this->assertEquals('', $savedReport->textValue('non_existent_key')); - $this->assertEquals('', (new SavedReport)->textValue('is_a_text_field')); + $this->assertEquals('', (new ReportTemplate)->textValue('is_a_text_field')); } public function testParsingRadioValue() { - $savedReport = SavedReport::factory()->create([ + $savedReport = ReportTemplate::factory()->create([ 'options' => [ 'is_a_radio_field' => null, ], @@ -50,7 +50,7 @@ public function testParsingRadioValue() public function testParsingSelectValue() { - $savedReport = SavedReport::factory()->create([ + $savedReport = ReportTemplate::factory()->create([ 'options' => [ 'is_a_text_field_as_well' => '4', 'contains_a_null_value' => null, @@ -64,7 +64,7 @@ public function testParsingSelectValue() public function testParsingSelectValues() { - $savedReport = SavedReport::factory()->create([ + $savedReport = ReportTemplate::factory()->create([ 'options' => [ 'is_an_array' => ['2', '3', '4'], 'is_an_array_containing_null' => [null], From ebf760a477614d8e848db11e81810332bd07d76d Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 19 Dec 2023 18:01:19 -0500 Subject: [PATCH 034/169] translations, UI fixes --- .../Controllers/ReportTemplatesController.php | 7 ++++ app/Http/Controllers/ReportsController.php | 2 +- resources/lang/en/admin/reports/message.php | 10 ++++- resources/views/reports/custom.blade.php | 41 ++++++++----------- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index 5671cef24469..718dd95f0e74 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -18,6 +18,13 @@ public function store(Request $request) 'name' => $request->get('name'), 'options' => $request->except(['_token', 'name']), ]); +// This is for error handling in creation. This probably is the wrong spot, and syntax is off, but i don't wanna forget +// if(is_null($report->name)) { +// return redirect()->route('reports/custom')->with('error', trans('reports/message.create.needs_title')); +// } +// elseif(exists($report->name)) { +// return redirect()->route('reports/custom')->with('error', trans('reports/message.create.duplicate')); +// } return redirect()->route('reports/custom', ['report' => $report->id]); } diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 864e88965325..443245a7169b 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -411,7 +411,7 @@ public function getCustomReport(Request $request) */ public function postCustom(Request $request) { - dd('postCustom', $request->all()); + // dd('postCustom', $request->all()); ini_set('max_execution_time', env('REPORT_TIME_LIMIT', 12000)); //12000 seconds = 200 minutes $this->authorize('reports.view'); diff --git a/resources/lang/en/admin/reports/message.php b/resources/lang/en/admin/reports/message.php index d4c8f8198f9c..98e4ec195a21 100644 --- a/resources/lang/en/admin/reports/message.php +++ b/resources/lang/en/admin/reports/message.php @@ -1,5 +1,13 @@ 'You must select at least ONE option.' + 'error' => 'You must select at least ONE option.', + + 'create' => [ + 'success' => 'Report saved successfully', + 'needs_title' => 'Report title can not be blank.', + 'duplicate' => 'Report title already exists. Please choose a different one.', + ], + + 'delete' => 'Are you sure you want to delete this report?', ); diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 016020a508fb..9b569f5baa96 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -44,8 +44,8 @@ @method('PUT') -
@@ -58,19 +58,27 @@ class="btn btn-sm btn-warning" title="Update" > - Update + {{ trans('general.update') }} + +{{-- This is from the license.view page-- + See line 1077 in routes.api for example of routing +{{-- --}} +{{-- --}} +{{-- {{ trans('general.delete') }}--}} +{{-- --}} + {{-- these were pulled from hardware.index and the one below doesn't work...--}} - Delete + {{ trans('general.delete') }}
@endif @@ -407,7 +415,7 @@ class="actions btn btn-danger btn-sm delete-asset"
- {{ Form::close() }} {{--does this need to be at the bottom of all our new stuff?--}} + {{ Form::close() }}
@@ -416,7 +424,7 @@ class="actions btn btn-danger btn-sm delete-asset"
@csrf - {{--this means that the name of a loaded report is in the input box. could lead to confusion with update--}} + {{--this means that the name of a loaded report is in the input box. could lead to confusion with update--}} @@ -427,7 +435,7 @@ class="actions btn btn-danger btn-sm delete-asset" -{{-- @if($saved_reports->first()!="")--}} -{{-- --}} -{{-- --}} -{{-- @csrf--}} -{{-- --}} -{{-- --}} -{{-- --}} -{{--
--}} -{{-- --}} -{{-- @endif--}} - @push('js') @endpush
+
+
+ @csrf + +
+ {{--this means that the name of a loaded report is in the input box. could lead to confusion with update--}} + + + {!! $errors->first('name', '') !!} +
+ +
+
@endif From c35179b0987bc0caa38d82ac6b9ede25242eafec Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 20 Dec 2023 13:48:31 -0800 Subject: [PATCH 036/169] Use existing class in place of inline styling --- resources/views/reports/custom.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 8e496721846a..ce0a3abbb7b6 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -420,7 +420,7 @@ class="actions btn btn-danger btn-sm delete-report" {{--This was delete-asset as
@if (! request()->routeIs('report-templates.edit')) -
+
From 26cc4497eb494586e0e51a4cfb003049a32c3aa9 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 20 Dec 2023 14:01:46 -0800 Subject: [PATCH 037/169] Use dedicated show route for report templates --- .../Controllers/ReportTemplatesController.php | 21 +++++++++++++++++++ app/Http/Controllers/ReportsController.php | 2 +- resources/views/reports/custom.blade.php | 4 ++-- routes/web.php | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index 718dd95f0e74..faac5164601e 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -29,6 +29,27 @@ public function store(Request $request) return redirect()->route('reports/custom', ['report' => $report->id]); } + public function show(Request $request, $reportId) + { + $this->authorize('reports.view'); + + $reportTemplate = ReportTemplate::find($reportId); + + if (!$reportTemplate) { + return redirect()->route('reports/custom') + ->with('error', 'Template does not exist or you do not have permission to view it.'); + } + + $customfields = CustomField::get(); + $report_templates = ReportTemplate::orderBy('name')->get(); + + return view('reports/custom', [ + 'customfields' => $customfields, + 'report_templates' => $report_templates, + 'reportTemplate' => $reportTemplate, + ]); + } + public function edit(Request $request, $reportId) { $report = ReportTemplate::findOrFail($reportId); diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 443245a7169b..5533b776bd03 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -397,7 +397,7 @@ public function getCustomReport(Request $request) return view('reports/custom', [ 'customfields' => $customfields, 'report_templates' => $report_templates, - 'reportTemplate' => $report_templates->find($request->input('report')) ?? new ReportTemplate, + 'reportTemplate' => new ReportTemplate, ]); } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index ce0a3abbb7b6..97f7ef088c55 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -429,7 +429,7 @@ class="form-control select2" > @foreach($report_templates as $template) - @endforeach @@ -439,7 +439,7 @@ class="form-control select2" @endpush
+ @endif + @if (request()->routeIs('reports/custom'))
@csrf From 0527201ae52651243b0810b75330d4a011859ab8 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 20 Dec 2023 14:41:23 -0800 Subject: [PATCH 039/169] Allow templates to be updated --- .../Controllers/ReportTemplatesController.php | 24 ++++++-------- resources/views/reports/custom.blade.php | 32 ++++++++----------- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index faac5164601e..daefab2219a0 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -26,7 +26,7 @@ public function store(Request $request) // return redirect()->route('reports/custom')->with('error', trans('reports/message.create.duplicate')); // } - return redirect()->route('reports/custom', ['report' => $report->id]); + return redirect()->route('report-templates.show', $report->id); } public function show(Request $request, $reportId) @@ -60,24 +60,20 @@ public function edit(Request $request, $reportId) ]); } - public function update(Request $request) + public function update(Request $request, $reportId) { - $this->authorize('update',ReportTemplate::class); + $this->authorize('reports.view'); + + $reportTemplate = ReportTemplate::find($reportId); - if(is_null($reportid = ReportTemplate::find($request))) - { + if (!$reportTemplate) { + // @todo: what is the behavior we want? return redirect()->route('reports/custom'); } - $request->validate()->report->id->getRules(); - - - $report = $request->user()->reportTemplates()->edit([ - 'name' => $request->get('name'), - 'options' => $request->except(['token','name']), - ]); - - return redirect()->route('reports/custom', ['report' => $report->id]); + $reportTemplate->options = $request->except(['_token', 'name']); + $reportTemplate->save(); + return redirect()->route('report-templates.show', $reportTemplate->id); } } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index c30ae2dfcb90..83f420297913 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -20,7 +20,7 @@ 'method' => 'post', 'class' => 'form-horizontal', 'id' => 'custom-report-form', - 'url' => '/reports/custom', + 'url' => request()->routeIs('report-templates.edit') ? route('report-templates.update', $reportTemplate) : '/reports/custom', ]) }} {{csrf_field()}} @@ -36,20 +36,7 @@ {{ trans('general.customize_report') }} @endif - @if ($reportTemplate->exists && request()->routeIs('report-templates.edit')) -
- {{-- todo --}} - id) }}"> - @csrf - @method('PUT') - - - - -
- @elseif ($reportTemplate->exists) + @if ($reportTemplate->exists) {{ Form::close() }} From 9d062f9849377901d09f58fb9ce4656d072f7a0f Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 20 Dec 2023 16:08:25 -0800 Subject: [PATCH 040/169] Make control statements more explicit --- resources/views/reports/custom.blade.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 83f420297913..d9da2d61d747 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -28,15 +28,15 @@

- @if ($reportTemplate->exists && request()->routeIs('report-templates.edit')) + @if (request()->routeIs('report-templates.edit')) Updating: {{ $reportTemplate->name }} - @elseif($reportTemplate->exists) + @elseif(request()->routeIs('report-templates.show')) Saved Template: {{ $reportTemplate->name }} @else {{ trans('general.customize_report') }} @endif

- @if ($reportTemplate->exists) + @if (request()->routeIs('report-templates.show') || request()->routeIs('report-templates.edit'))
Date: Wed, 20 Dec 2023 16:19:04 -0800 Subject: [PATCH 041/169] Implement ability to delete templates --- .../Controllers/ReportTemplatesController.php | 18 ++++++++++ resources/views/reports/custom.blade.php | 33 +++++++++---------- routes/web.php | 3 +- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index daefab2219a0..f4d9ac02fe21 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -76,4 +76,22 @@ public function update(Request $request, $reportId) return redirect()->route('report-templates.show', $reportTemplate->id); } + + public function destroy($reportId) + { + $this->authorize('reports.view'); + + $reportTemplate = ReportTemplate::find($reportId); + + if (!$reportTemplate) { + // @todo: what is the behavior we want? + return redirect()->route('reports/custom') + ->with('error', 'Template does not exist or you do not have permission to delete it.'); + } + + $reportTemplate->delete(); + + return redirect()->route('reports/custom') + ->with('success', 'Template deleted.'); + } } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index d9da2d61d747..305104c02dd3 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -47,26 +47,16 @@ class="btn btn-sm btn-warning" {{ trans('general.update') }} - -{{-- This is from the license.view page-- - See line 1077 in routes.api for example of routing -{{-- --}} -{{-- --}} -{{-- {{ trans('general.delete') }}--}} -{{-- --}} - - {{-- these were pulled from hardware.index and the one below doesn't work...--}} - - {{ trans('general.delete') }} - + {{ trans('general.delete') }} +
@endif
@@ -518,5 +508,12 @@ class="form-control select2" form.attr('action', '{{ route('report-templates.store') }}').submit(); }); + $('#dataConfirmModal').on('show.bs.modal', function (event) { + var content = $(event.relatedTarget).data('content'); + var title = $(event.relatedTarget).data('title'); + $(this).find(".modal-body").text(content); + $(this).find(".modal-header").text(title); + }); + @stop diff --git a/routes/web.php b/routes/web.php index 7e19306c19c2..32263816aa8c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -360,7 +360,8 @@ Route::post('reports/saved-templates', [ReportTemplatesController::class, 'store'])->name('report-templates.store'); Route::get('reports/saved-templates/{reportId}', [ReportTemplatesController::class, 'show'])->name('report-templates.show'); Route::get('reports/saved-templates/{reportId}/edit', [ReportTemplatesController::class, 'edit'])->name('report-templates.edit'); - Route::post('report/saved-templates/{reportId}', [ReportTemplatesController::class, 'update'])->name('report-templates.update'); + Route::post('reports/saved-templates/{reportId}', [ReportTemplatesController::class, 'update'])->name('report-templates.update'); + Route::delete('reports/saved-templates/{reportId}', [ReportTemplatesController::class, 'destroy'])->name('report-templates.destroy'); Route::get( 'reports/activity', From 9a5c8c4ce6a8ad804d67cc4b0ded9da935482b96 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 20 Dec 2023 16:24:48 -0800 Subject: [PATCH 042/169] Formatting and clean ups --- .../Controllers/ReportTemplatesController.php | 20 +++++-------------- resources/views/reports/custom.blade.php | 3 --- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index f4d9ac02fe21..d98d2777e4a6 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -18,18 +18,11 @@ public function store(Request $request) 'name' => $request->get('name'), 'options' => $request->except(['_token', 'name']), ]); -// This is for error handling in creation. This probably is the wrong spot, and syntax is off, but i don't wanna forget -// if(is_null($report->name)) { -// return redirect()->route('reports/custom')->with('error', trans('reports/message.create.needs_title')); -// } -// elseif(exists($report->name)) { -// return redirect()->route('reports/custom')->with('error', trans('reports/message.create.duplicate')); -// } return redirect()->route('report-templates.show', $report->id); } - public function show(Request $request, $reportId) + public function show($reportId) { $this->authorize('reports.view'); @@ -50,13 +43,11 @@ public function show(Request $request, $reportId) ]); } - public function edit(Request $request, $reportId) + public function edit($reportId) { - $report = ReportTemplate::findOrFail($reportId); - return view('reports/custom', [ 'customfields' => CustomField::get(), - 'reportTemplate' => $report, + 'reportTemplate' => ReportTemplate::findOrFail($reportId), ]); } @@ -67,8 +58,8 @@ public function update(Request $request, $reportId) $reportTemplate = ReportTemplate::find($reportId); if (!$reportTemplate) { - // @todo: what is the behavior we want? - return redirect()->route('reports/custom'); + return redirect()->route('reports/custom') + ->with('error', 'Template does not exist or you do not have permission to view it.'); } $reportTemplate->options = $request->except(['_token', 'name']); @@ -84,7 +75,6 @@ public function destroy($reportId) $reportTemplate = ReportTemplate::find($reportId); if (!$reportTemplate) { - // @todo: what is the behavior we want? return redirect()->route('reports/custom') ->with('error', 'Template does not exist or you do not have permission to delete it.'); } diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 305104c02dd3..c5e936393e25 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -497,8 +497,6 @@ class="form-control select2" e.preventDefault(e); let form = $('#custom-report-form'); - {{-- handle null? --}} - {{-- handle duplicate name? --}} $('').attr({ type: 'hidden', name: 'name', @@ -514,6 +512,5 @@ class="form-control select2" $(this).find(".modal-body").text(content); $(this).find(".modal-header").text(title); }); - @stop From 578495bab6986513b1da798d22a20d06c8befeed Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 20 Dec 2023 16:37:27 -0800 Subject: [PATCH 043/169] Update tests --- database/factories/ReportTemplateFactory.php | 2 +- .../ReportTemplates/ReportTemplateTest.php | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/database/factories/ReportTemplateFactory.php b/database/factories/ReportTemplateFactory.php index 1ece94e410c8..bb5cac5963ac 100644 --- a/database/factories/ReportTemplateFactory.php +++ b/database/factories/ReportTemplateFactory.php @@ -15,7 +15,7 @@ public function definition() { return [ 'name' => $this->faker->word(), - 'options' => json_encode([]), + 'options' => [], ]; } } diff --git a/tests/Feature/ReportTemplates/ReportTemplateTest.php b/tests/Feature/ReportTemplates/ReportTemplateTest.php index 92a6ac696d09..4a56f5eda6fa 100644 --- a/tests/Feature/ReportTemplates/ReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/ReportTemplateTest.php @@ -22,34 +22,34 @@ public function testCanLoadCustomReportPage() }]); } - public function testCanLoadASavedCustomReport() + public function testCanLoadASavedReportTemplate() { $user = User::factory()->canViewReports()->create(); - $reportTemplate = ReportTemplate::factory()->make(['name' => 'My Awesome Report']); + $reportTemplate = ReportTemplate::factory()->make(['name' => 'My Awesome Template']); $user->reportTemplates()->save($reportTemplate); $this->actingAs($user) - ->get(route('reports/custom', ['report' => $reportTemplate->id])) + ->get(route('report-templates.show', $reportTemplate)) ->assertOk() ->assertViewHas(['reportTemplate' => function (ReportTemplate $viewReport) use ($reportTemplate) { return $viewReport->is($reportTemplate); }]); } - public function testCanSaveACustomReport() + public function testCanSaveAReportTemplate() { $user = User::factory()->canViewReports()->create(); $this->actingAs($user) ->post(route('report-templates.store'), [ - 'name' => 'My Awesome Report', + 'name' => 'My Awesome Template', 'company' => '1', 'by_company_id' => ['1', '2'], ]) ->assertRedirect(); $template = $user->reportTemplates->first(function ($report) { - return $report->name === 'My Awesome Report'; + return $report->name === 'My Awesome Template'; }); $this->assertNotNull($template); @@ -57,7 +57,7 @@ public function testCanSaveACustomReport() $this->assertEquals(['1', '2'], $template->options['by_company_id']); } - public function testSavingReportRequiresValidFields() + public function testReportTemplateRequiresValidFields() { $this->actingAs(User::factory()->canViewReports()->create()) ->post(route('report-templates.store'), [ @@ -66,7 +66,7 @@ public function testSavingReportRequiresValidFields() ->assertSessionHasErrors('name'); } - public function testSavingReportRequiresCorrectPermission() + public function testSavingReportTemplateRequiresCorrectPermission() { $this->actingAs(User::factory()->create()) ->post(route('report-templates.store')) From fda77179a34550335cf027cf846525ca8bff01d4 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 20 Dec 2023 16:48:25 -0800 Subject: [PATCH 044/169] Simplify url --- resources/views/reports/custom.blade.php | 2 +- routes/web.php | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index c5e936393e25..a3e397f8fbee 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -423,7 +423,7 @@ class="form-control select2" - @endpush
@endif @if (request()->routeIs('reports/custom')) @@ -556,6 +544,14 @@ class="form-control select2" form.attr('action', '{{ route('report-templates.store') }}').submit(); }); + $('#saved_report_select') + .on('select2:select', function (event) { + window.location.href = '/reports/templates/' + event.params.data.id; + }) + .on('select2:clearing', function (event) { + window.location.href = '{{ route('reports/custom') }}'; + }); + $('#dataConfirmModal').on('show.bs.modal', function (event) { var content = $(event.relatedTarget).data('content'); var title = $(event.relatedTarget).data('title'); From 27103124bf3af9b17cc8cdaa6eeb4c62ee757419 Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 9 Jan 2024 16:49:56 -0500 Subject: [PATCH 074/169] messages/translations --- app/Http/Controllers/ReportTemplatesController.php | 2 +- resources/lang/en/admin/reports/general.php | 1 + resources/lang/en/admin/reports/message.php | 2 ++ resources/views/reports/custom.blade.php | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index d98d2777e4a6..56468403e857 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -30,7 +30,7 @@ public function show($reportId) if (!$reportTemplate) { return redirect()->route('reports/custom') - ->with('error', 'Template does not exist or you do not have permission to view it.'); + ->with('error', 'Template does not exist or you do not have permission to view it.'); //needs translation } $customfields = CustomField::get(); diff --git a/resources/lang/en/admin/reports/general.php b/resources/lang/en/admin/reports/general.php index cc87e1334d10..0b7d515fb2b3 100644 --- a/resources/lang/en/admin/reports/general.php +++ b/resources/lang/en/admin/reports/general.php @@ -12,4 +12,5 @@ 'apply_template' => 'Apply Template', 'generate_template' => 'Generate Template', 'apply_and_generate' => 'Apply and Generate', + 'report_name' => 'Report Name', ]; \ No newline at end of file diff --git a/resources/lang/en/admin/reports/message.php b/resources/lang/en/admin/reports/message.php index 98e4ec195a21..c52a2a003e47 100644 --- a/resources/lang/en/admin/reports/message.php +++ b/resources/lang/en/admin/reports/message.php @@ -10,4 +10,6 @@ ], 'delete' => 'Are you sure you want to delete this report?', + 'no_report_permission' => 'Template does not exist or you do not have permission to view it.', + ); diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index ed27c986094b..61005117061c 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -477,7 +477,7 @@ class="form-control select2"
{{--this means that the name of a loaded report is in the input box. could lead to confusion with update--}} - + {!! $errors->first('name', '') !!}
From a5099b5163b40b4660060c7909f0133bda440326 Mon Sep 17 00:00:00 2001 From: akemidx Date: Wed, 10 Jan 2024 15:23:42 -0500 Subject: [PATCH 075/169] translations/messages on report template controller --- app/Http/Controllers/ReportTemplatesController.php | 8 ++++---- resources/lang/en/admin/reports/message.php | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index 56468403e857..684b9527cdb4 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -30,7 +30,7 @@ public function show($reportId) if (!$reportTemplate) { return redirect()->route('reports/custom') - ->with('error', 'Template does not exist or you do not have permission to view it.'); //needs translation + ->with('error', trans('admin/reports/message.no_report_permission')); } $customfields = CustomField::get(); @@ -59,7 +59,7 @@ public function update(Request $request, $reportId) if (!$reportTemplate) { return redirect()->route('reports/custom') - ->with('error', 'Template does not exist or you do not have permission to view it.'); + ->with('error', trans('admin/reports/message.no_report_permission')); } $reportTemplate->options = $request->except(['_token', 'name']); @@ -76,12 +76,12 @@ public function destroy($reportId) if (!$reportTemplate) { return redirect()->route('reports/custom') - ->with('error', 'Template does not exist or you do not have permission to delete it.'); + ->with('error', trans('admin/reports/message.delete.no_delete_permission')); } $reportTemplate->delete(); return redirect()->route('reports/custom') - ->with('success', 'Template deleted.'); + ->with('success', trans('admin/reports/message.delete.delete_confirm')); } } diff --git a/resources/lang/en/admin/reports/message.php b/resources/lang/en/admin/reports/message.php index c52a2a003e47..6c0c2461838b 100644 --- a/resources/lang/en/admin/reports/message.php +++ b/resources/lang/en/admin/reports/message.php @@ -2,6 +2,7 @@ return array( 'error' => 'You must select at least ONE option.', + 'no_report_permission' => 'Template does not exist or you do not have permission to view it.', 'create' => [ 'success' => 'Report saved successfully', @@ -9,7 +10,10 @@ 'duplicate' => 'Report title already exists. Please choose a different one.', ], + 'delete' => [ 'delete' => 'Are you sure you want to delete this report?', - 'no_report_permission' => 'Template does not exist or you do not have permission to view it.', + 'delete_confirm' => 'Template deleted', + 'no_delete_permission' => 'Template does not exist or you do not have permission to delete it.', + ], ); From 5f8e91455f9e4a847e56067d0c8275877c077196 Mon Sep 17 00:00:00 2001 From: akemidx Date: Wed, 10 Jan 2024 15:39:32 -0500 Subject: [PATCH 076/169] clarifying name box --- resources/lang/en/admin/reports/general.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/en/admin/reports/general.php b/resources/lang/en/admin/reports/general.php index 0b7d515fb2b3..37b1ca7b164c 100644 --- a/resources/lang/en/admin/reports/general.php +++ b/resources/lang/en/admin/reports/general.php @@ -12,5 +12,5 @@ 'apply_template' => 'Apply Template', 'generate_template' => 'Generate Template', 'apply_and_generate' => 'Apply and Generate', - 'report_name' => 'Report Name', + 'report_name' => 'Enter Report Name', ]; \ No newline at end of file From 6f6341bc097ae1c6d9f64f94bf6c73f1657794a1 Mon Sep 17 00:00:00 2001 From: akemidx Date: Wed, 10 Jan 2024 16:33:35 -0500 Subject: [PATCH 077/169] about saved reports box --- resources/lang/en/admin/reports/message.php | 2 ++ resources/views/reports/custom.blade.php | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/resources/lang/en/admin/reports/message.php b/resources/lang/en/admin/reports/message.php index 6c0c2461838b..5c5363ecee5c 100644 --- a/resources/lang/en/admin/reports/message.php +++ b/resources/lang/en/admin/reports/message.php @@ -3,6 +3,8 @@ return array( 'error' => 'You must select at least ONE option.', 'no_report_permission' => 'Template does not exist or you do not have permission to view it.', + 'about_reports' => 'About Saved Reports', + 'saving_reports_description' => 'Select your options, then enter the name of your report in the box above and click the \'Save Template\' button. Use the dropdown to select a previously saved report.', 'create' => [ 'success' => 'Report saved successfully', diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 61005117061c..d5f55239d325 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -487,6 +487,13 @@ class="form-control select2"
@endif +
+

{{ trans('admin/reports/message.about_reports') }}

+
+
+

{!! trans('admin/reports/message.saving_reports_description') !!}

+
+
From b34886ead6eb1c69e5884c8234e32870e0f01601 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 11 Jan 2024 13:04:46 -0800 Subject: [PATCH 078/169] Move box header into box --- resources/views/reports/custom.blade.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index d5f55239d325..d164bbae8db0 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -488,9 +488,10 @@ class="form-control select2" @endif
-

{{ trans('admin/reports/message.about_reports') }}

-
+
+

{{ trans('admin/reports/message.about_reports') }}

+

{!! trans('admin/reports/message.saving_reports_description') !!}

From 0202a97e976743cfc24f184fd3d18f0d96740e5b Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 11 Jan 2024 13:08:08 -0800 Subject: [PATCH 079/169] Add missing tag --- resources/views/reports/custom.blade.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index d164bbae8db0..08d1c3bdc212 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -491,9 +491,10 @@ class="form-control select2"

{{ trans('admin/reports/message.about_reports') }}

+
-

{!! trans('admin/reports/message.saving_reports_description') !!}

-
+

{!! trans('admin/reports/message.saving_reports_description') !!}

+
From 82df7a66ec030b99285f9241f65ccecc1a11ac12 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 11 Jan 2024 13:19:36 -0800 Subject: [PATCH 080/169] Add form label and remove info box from show and edit pages --- resources/views/reports/custom.blade.php | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 08d1c3bdc212..9817c3aaf581 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -455,6 +455,7 @@ class="btn btn-sm btn-danger delete-asset"
@if (! request()->routeIs('report-templates.edit'))
+ + data-placeholder="{{ trans('admin/reports/general.saved_templates') }}" + data-allow-clear="true"> @foreach($report_templates as $template)
-

{{ trans('admin/reports/message.about_reports') }}

+

{{ trans('admin/reports/message.about_templates') }}

-

{!! trans('admin/reports/message.saving_reports_description') !!}

+

{!! trans('admin/reports/message.saving_templates_description') !!}

@endif From 2768f19b7c45a5c249c118b62284971f0fe9712a Mon Sep 17 00:00:00 2001 From: akemidx Date: Tue, 16 Jan 2024 18:56:29 -0500 Subject: [PATCH 086/169] code cleanup --- resources/views/reports/custom.blade.php | 436 +++++++++++------------ tests/Unit/ReportTemplateTest.php | 1 - 2 files changed, 218 insertions(+), 219 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 20624eb4c96a..92f831372a67 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -14,206 +14,206 @@ @section('content')
-
- - {{ Form::open([ - 'method' => 'post', - 'class' => 'form-horizontal', - 'id' => 'custom-report-form', - 'url' => request()->routeIs('report-templates.edit') ? route('report-templates.update', $reportTemplate) : '/reports/custom', - ]) }} +
+ + {{ Form::open([ + 'method' => 'post', + 'class' => 'form-horizontal', + 'id' => 'custom-report-form', + 'url' => request()->routeIs('report-templates.edit') ? route('report-templates.update', $reportTemplate) : '/reports/custom', + ]) }} {{csrf_field()}} -
-
-

- @if (request()->routeIs('report-templates.edit')) - Updating: {{ $reportTemplate->name }} - @elseif(request()->routeIs('report-templates.show')) - Saved Template: {{ $reportTemplate->name }} - @else - {{ trans('general.customize_report') }} +
+
+

+ @if (request()->routeIs('report-templates.edit')) + Updating: {{ $reportTemplate->name }} + @elseif(request()->routeIs('report-templates.show')) + Saved Template: {{ $reportTemplate->name }} + @else + {{ trans('general.customize_report') }} + @endif +

+ @if (request()->routeIs('report-templates.show')) +
+ + + {{ trans('general.update') }} + + +
@endif -

- @if (request()->routeIs('report-templates.show')) -
- - - {{ trans('general.update') }} - - -
- @endif
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -435,22 +435,22 @@ class="btn btn-sm btn-danger delete-asset"
- -
+ +
{{ Form::close() }} -
+
@@ -488,12 +488,12 @@ class="form-control select2"
-
-

{{ trans('admin/reports/message.about_templates') }}

-
-
-

{!! trans('admin/reports/message.saving_templates_description') !!}

-
+
+

{{ trans('admin/reports/message.about_templates') }}

+
+
+

{!! trans('admin/reports/message.saving_templates_description') !!}

+
@endif
@@ -537,7 +537,7 @@ class="form-control select2" }); $("#checkAll").change(function () { - $("input:checkbox").prop('checked', $(this).prop("checked")); + $("input:checkbox").prop('checked', $(this).prop("checked")); }); $("#savetemplateform").submit(function(e) { @@ -554,12 +554,12 @@ class="form-control select2" }); $('#saved_report_select') - .on('select2:select', function (event) { - window.location.href = '/reports/templates/' + event.params.data.id; - }) - .on('select2:clearing', function (event) { - window.location.href = '{{ route('reports/custom') }}'; - }); + .on('select2:select', function (event) { + window.location.href = '/reports/templates/' + event.params.data.id; + }) + .on('select2:clearing', function (event) { + window.location.href = '{{ route('reports/custom') }}'; + }); $('#dataConfirmModal').on('show.bs.modal', function (event) { var content = $(event.relatedTarget).data('content'); diff --git a/tests/Unit/ReportTemplateTest.php b/tests/Unit/ReportTemplateTest.php index d76f89fd5a89..ff361753829e 100644 --- a/tests/Unit/ReportTemplateTest.php +++ b/tests/Unit/ReportTemplateTest.php @@ -99,7 +99,6 @@ public function testParsingSelectValues() $this->assertEquals(['2', '3', '4'], $template->selectValues('an_array')); $this->assertEquals([], $template->selectValues('an_empty_array')); - // @todo: should this actually be []? $this->assertEquals([null], $template->selectValues('an_array_containing_null')); $this->assertEquals([], $template->selectValues('non_existent_key')); } From 0883321d9e7961bddc1253a7c361f946bbe8d1af Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 17 Jan 2024 11:24:38 -0800 Subject: [PATCH 087/169] Only limit template creator scope when authenticated --- app/Models/ReportTemplate.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Models/ReportTemplate.php b/app/Models/ReportTemplate.php index dadff6a27b38..0ec2f854c44d 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -36,7 +36,9 @@ protected static function booted() { // Scope to current user static::addGlobalScope('current_user', function (Builder $builder) { - $builder->where('user_id', auth()->id()); + if (auth()->check()) { + $builder->where('user_id', auth()->id()); + } }); } From 5a396cc9979c9fc0280f695788c161d6bcff0dcc Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 17 Jan 2024 11:24:50 -0800 Subject: [PATCH 088/169] Add assertion --- tests/Unit/ReportTemplateTest.php | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/tests/Unit/ReportTemplateTest.php b/tests/Unit/ReportTemplateTest.php index ff361753829e..465f167adb06 100644 --- a/tests/Unit/ReportTemplateTest.php +++ b/tests/Unit/ReportTemplateTest.php @@ -131,11 +131,6 @@ public function testSelectValueDoesNotIncludeDeletedOrNonExistentModels() $this->assertNull((new ReportTemplate)->selectValue('value_on_unsaved_template', Location::class)); } - public function testSelectValueDoesNotIncludeModelUserDoesNotHaveAccessTo() - { - $this->markTestIncomplete(); - } - public function testSelectValuesDoNotIncludeDeletedOrNonExistentModels() { [$locationA, $locationB] = Location::factory()->count(2)->create(); @@ -160,16 +155,10 @@ public function testSelectValuesDoNotIncludeDeletedOrNonExistentModels() $this->assertNotContains($invalidId, $parsedValues); } - public function testSelectValuesDoesNotIncludeModelUserDoesNotHaveAccessTo() - { - $this->markTestIncomplete(); - } - public function testGracefullyHandlesSingleSelectBecomingMultiSelect() { $department = Department::factory()->create(); - // Given a report template saved with a property that is a string value $templateWithValue = ReportTemplate::factory()->create([ 'options' => ['single_value' => 'a string'], ]); @@ -178,8 +167,15 @@ public function testGracefullyHandlesSingleSelectBecomingMultiSelect() 'options' => ['by_dept_id' => $department->id], ]); + // If nothing is selected for a single select then it is stored + // as null and should be returned as an empty array. + $templateWithNull = ReportTemplate::factory()->create([ + 'options' => ['by_dept_id' => null], + ]); + $this->assertEquals(['a string'], $templateWithValue->selectValues('single_value')); $this->assertContains($department->id, $templateWithModelId->selectValues('by_dept_id', Department::class)); + $this->assertEquals([], $templateWithNull->selectValues('by_dept_id')); } public function testGracefullyHandlesMultiSelectBecomingSingleSelectBySelectingTheFirstValue() From 4d8d069bbc6b5f557b4b1aa781e0a638970ab3eb Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 17 Jan 2024 11:43:34 -0800 Subject: [PATCH 089/169] Update placeholder --- resources/lang/en/admin/reports/general.php | 3 ++- resources/views/reports/custom.blade.php | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/resources/lang/en/admin/reports/general.php b/resources/lang/en/admin/reports/general.php index 938a191a2853..c4a0a0b03c94 100644 --- a/resources/lang/en/admin/reports/general.php +++ b/resources/lang/en/admin/reports/general.php @@ -9,8 +9,9 @@ 'acceptance_request' => 'Acceptance request', 'saved_templates' => 'Saved Templates', 'save_template' => 'Save Template', + 'select_a_template' => 'Select a Template', 'apply_template' => 'Apply Template', 'generate_template' => 'Generate Template', 'apply_and_generate' => 'Apply and Generate', 'template_name' => 'Enter Template Name', -]; \ No newline at end of file +]; diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 92f831372a67..7fd0e9f845d9 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -460,8 +460,9 @@ class="btn btn-sm btn-danger delete-asset" + @@ -349,9 +349,9 @@ class="btn btn-sm btn-danger delete-asset"
- + to - +
@@ -359,9 +359,9 @@ class="btn btn-sm btn-danger delete-asset"
- + to - +
@@ -369,9 +369,9 @@ class="btn btn-sm btn-danger delete-asset"
- + to - +
@@ -379,9 +379,9 @@ class="btn btn-sm btn-danger delete-asset"
- + to - +
@@ -389,9 +389,9 @@ class="btn btn-sm btn-danger delete-asset"
- + to - +
@@ -399,36 +399,36 @@ class="btn btn-sm btn-danger delete-asset"
- + to - +
@@ -480,7 +480,7 @@ class="form-control select2"
- + {!! $errors->first('name', '') !!}
- - @endif + @if (request()->routeIs('report-templates.show')) +
+ + + {{ trans('general.update') }} + + +
+ @endif
From 37d792352d6eed17967c15d5723cbfb37dcbed62 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 6 Nov 2024 12:11:35 -0800 Subject: [PATCH 157/169] Update page title dynamically --- resources/views/reports/custom.blade.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index c8c7740c53c3..d13c2a35a56d 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -2,7 +2,13 @@ {{-- Page Title --}} @section('title') -{{ trans('general.custom_report') }} + @if (request()->routeIs('report-templates.edit')) + {{ trans('general.update') }} {{ $template->name }} + @elseif(request()->routeIs('report-templates.show')) + {{ trans('general.custom_report') }}: {{ $template->name }} + @else + {{ trans('general.custom_report') }} + @endif @parent @stop @@ -11,7 +17,7 @@ {{ trans('general.back') }} - @elseif(request()->routeIs('report-templates.show')) + @elseif (request()->routeIs('report-templates.show')) {{ trans('general.back') }} From 8873137ed05e44b43e15e40cbd88b12917471842 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 6 Nov 2024 12:29:31 -0800 Subject: [PATCH 158/169] Scaffold updating template name --- .../Controllers/ReportTemplatesController.php | 3 +++ .../lang/en-US/admin/reports/general.php | 2 +- resources/views/reports/custom.blade.php | 23 +++++++++++++++---- .../UpdateReportTemplateTest.php | 3 +++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index 6b8fe33a2edf..a05e477b3720 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -55,6 +55,9 @@ public function update(Request $request, ReportTemplate $reportTemplate): Redire { $this->authorize('reports.view'); + // @todo: validation + + $reportTemplate->name = $request->input('name'); $reportTemplate->options = $request->except(['_token', 'name']); $reportTemplate->save(); diff --git a/resources/lang/en-US/admin/reports/general.php b/resources/lang/en-US/admin/reports/general.php index c992e2e116e1..ea22b07dfebf 100644 --- a/resources/lang/en-US/admin/reports/general.php +++ b/resources/lang/en-US/admin/reports/general.php @@ -17,6 +17,6 @@ 'open_saved_template' => 'Open Saved Template', 'save_template' => 'Save Template', 'select_a_template' => 'Select a Template', - 'template_name' => 'Enter Template Name', + 'template_name' => 'Template Name', 'update_template' => 'Update Template', ]; diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index d13c2a35a56d..1f0d6fd812e6 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -47,14 +47,29 @@

- @if (request()->routeIs('report-templates.edit')) - {{ trans('general.updating_item', ['item' => $template->name]) }} - @elseif(request()->routeIs('report-templates.show')) + @if (request()->routeIs('report-templates.show')) {{ $template->name }} - @else + @elseif (request()->routeIs('reports/custom')) {{ trans('general.customize_report') }} @endif

+ @if (request()->routeIs('report-templates.edit')) +
+
+ + + {!! $errors->first('name', '') !!} +
+
+ @endif @if (request()->routeIs('report-templates.show'))
canViewReports()->create(); $reportTemplate = ReportTemplate::factory()->for($user, 'creator')->create([ + 'name' => 'Original Name', 'options' => [ 'id' => 1, 'category' => 1, @@ -41,12 +42,14 @@ public function testCanUpdateAReportTemplate() $this->actingAs($user) ->post($this->getRoute($reportTemplate), [ + 'name' => 'Updated Name', 'id' => 1, 'company' => 1, 'by_company_id' => [3], ]); $reportTemplate->refresh(); + $this->assertEquals('Updated Name', $reportTemplate->name); $this->assertEquals(1, $reportTemplate->checkmarkValue('id')); $this->assertEquals(0, $reportTemplate->checkmarkValue('category')); $this->assertEquals([], $reportTemplate->selectValues('by_category_id')); From c5710b858e1396536029aa3533359f84cd14057a Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 11:02:10 -0800 Subject: [PATCH 159/169] Add test validation test for update method and remove name uniqueness constraint --- .../Controllers/ReportTemplatesController.php | 9 +++++---- app/Models/ReportTemplate.php | 3 --- .../ReportTemplates/UpdateReportTemplateTest.php | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index a05e477b3720..27d56369defd 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -15,10 +15,10 @@ public function store(Request $request): RedirectResponse $this->authorize('reports.view'); // Ignore "options" rules since data does not come in under that key... - $request->validate(Arr::except((new ReportTemplate)->getRules(), 'options')); + $validated = $request->validate(Arr::except((new ReportTemplate)->getRules(), 'options')); $report = $request->user()->reportTemplates()->create([ - 'name' => $request->get('name'), + 'name' => $validated['name'], 'options' => $request->except(['_token', 'name']), ]); @@ -55,9 +55,10 @@ public function update(Request $request, ReportTemplate $reportTemplate): Redire { $this->authorize('reports.view'); - // @todo: validation + // Ignore "options" rules since data does not come in under that key... + $validated = $request->validate(Arr::except((new ReportTemplate)->getRules(), 'options')); - $reportTemplate->name = $request->input('name'); + $reportTemplate->name = $validated['name']; $reportTemplate->options = $request->except(['_token', 'name']); $reportTemplate->save(); diff --git a/app/Models/ReportTemplate.php b/app/Models/ReportTemplate.php index 2be8ea3ed456..d1a00c565715 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -24,11 +24,8 @@ class ReportTemplate extends Model ]; protected $rules = [ - // @todo: this should probably be unique for each user so people don't get errors trying to use a name someone else already used... - // @todo: but enabling shared reports in the future would mean we would have name collisions then... 'name' => [ 'required', - 'unique:report_templates,name', ], 'options' => [ 'required', diff --git a/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php b/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php index 5c94fd3e2c2d..8d4df153a6b5 100644 --- a/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php @@ -25,6 +25,21 @@ public function testCannotUpdateAnotherUsersReportTemplate() ->assertNotFound(); } + public function testUpdatingReportTemplateRequiresValidFields() + { + $user = User::factory()->canViewReports()->create(); + + $reportTemplate = ReportTemplate::factory()->for($user, 'creator')->create(); + + $this->actingAs($user) + ->post($this->getRoute($reportTemplate), [ + // + ]) + ->assertSessionHasErrors([ + 'name' => 'The name field is required.', + ]); + } + public function testCanUpdateAReportTemplate() { $user = User::factory()->canViewReports()->create(); From 7862b74e99eeec491486956c32667a45ea553777 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 11:03:03 -0800 Subject: [PATCH 160/169] Inline fields when updating --- app/Http/Controllers/ReportTemplatesController.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/ReportTemplatesController.php b/app/Http/Controllers/ReportTemplatesController.php index 27d56369defd..2be1da99e00d 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -58,9 +58,10 @@ public function update(Request $request, ReportTemplate $reportTemplate): Redire // Ignore "options" rules since data does not come in under that key... $validated = $request->validate(Arr::except((new ReportTemplate)->getRules(), 'options')); - $reportTemplate->name = $validated['name']; - $reportTemplate->options = $request->except(['_token', 'name']); - $reportTemplate->save(); + $reportTemplate->update([ + 'name' => $validated['name'], + 'options' => $request->except(['_token', 'name']), + ]); session()->flash('success', trans('admin/reports/message.update.success')); From 4aa59618600471fe31e9b40c0bb582fb2b019a5a Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 12:13:20 -0800 Subject: [PATCH 161/169] Update page titles --- resources/views/reports/custom.blade.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 1f0d6fd812e6..e817fde5dbdd 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -46,13 +46,11 @@
-

- @if (request()->routeIs('report-templates.show')) - {{ $template->name }} - @elseif (request()->routeIs('reports/custom')) + @if (request()->routeIs('reports/custom') || request()->routeIs('report-templates.show')) +

{{ trans('general.customize_report') }} - @endif -

+ + @endif @if (request()->routeIs('report-templates.edit'))
From f8d0ddb3f7a6caa4307bbd64cd7fbb33d56ddc94 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 14:17:20 -0800 Subject: [PATCH 162/169] Improve template name input --- resources/views/reports/custom.blade.php | 35 +++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index e817fde5dbdd..3ab43ed6b3b5 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -52,19 +52,28 @@ @endif @if (request()->routeIs('report-templates.edit')) -
-
- - - {!! $errors->first('name', '') !!} +
+
+
+ +
+ +
+ {!! $errors->first('name', '') !!} +
@endif From 363ec841d1f9294889c4cd96892eea90ab3f0033 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 16:40:37 -0800 Subject: [PATCH 163/169] Re-introduce soft deletes --- app/Models/ReportTemplate.php | 2 ++ .../2023_08_23_232739_create_report_templates_table.php | 1 + tests/Feature/ReportTemplates/DeleteReportTemplateTest.php | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Models/ReportTemplate.php b/app/Models/ReportTemplate.php index d1a00c565715..90b83cba548a 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -6,11 +6,13 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\SoftDeletes; use Watson\Validating\ValidatingTrait; class ReportTemplate extends Model { use HasFactory; + use SoftDeletes; use ValidatingTrait; protected $casts = [ diff --git a/database/migrations/2023_08_23_232739_create_report_templates_table.php b/database/migrations/2023_08_23_232739_create_report_templates_table.php index 0ca44f00704c..d9438f2cc8dc 100644 --- a/database/migrations/2023_08_23_232739_create_report_templates_table.php +++ b/database/migrations/2023_08_23_232739_create_report_templates_table.php @@ -18,6 +18,7 @@ public function up() $table->integer('created_by')->nullable(); $table->string('name'); $table->json('options'); + $table->softDeletes(); $table->timestamps(); $table->index('created_by'); }); diff --git a/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php b/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php index e77942256fab..52f4ad888dfa 100644 --- a/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php @@ -42,7 +42,7 @@ public function testCanDeleteAReportTemplate() ->delete($this->getRoute($reportTemplate)) ->assertRedirect(route('reports/custom')); - $this->assertModelMissing($reportTemplate); + $this->assertSoftDeleted($reportTemplate); } private function getRoute(ReportTemplate $reportTemplate): string From 0e3efdfe87af9009def11478acd2736d920d9f4d Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 16:40:54 -0800 Subject: [PATCH 164/169] Add string to name validation --- app/Models/ReportTemplate.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Models/ReportTemplate.php b/app/Models/ReportTemplate.php index 90b83cba548a..0770eafc495b 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -28,6 +28,7 @@ class ReportTemplate extends Model protected $rules = [ 'name' => [ 'required', + 'string', ], 'options' => [ 'required', From b8265d54bbca16ac37dd8b1fffc13165abb471da Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 16:42:55 -0800 Subject: [PATCH 165/169] Improve comment --- app/Http/Controllers/ReportsController.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 373df5641325..86cc27f64db9 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -398,11 +398,12 @@ public function getCustomReport(Request $request) : View $this->authorize('reports.view'); $customfields = CustomField::get(); $report_templates = ReportTemplate::orderBy('name')->get(); - // view needs template to render correctly, even if it is empty... + + // The view needs a template to render correctly, even if it is empty... $template = new ReportTemplate; - // Set the report's input values if we were redirected back with - // validation errors so the report is populated as expected. + // Set the report's input values in the cases we were redirected back + // with validation errors so the report is populated as expected. if ($request->old()) { $template->name = $request->old('name'); $template->options = $request->old(); From dc0b8c757283422b25fdaa921b2e316cbb509bf6 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 16:54:55 -0800 Subject: [PATCH 166/169] Inline route helpers in tests --- .../ReportTemplates/DeleteReportTemplateTest.php | 11 +++-------- .../ReportTemplates/EditReportTemplateTest.php | 11 +++-------- .../ReportTemplates/ShowReportTemplateTest.php | 11 +++-------- .../ReportTemplates/StoreReportTemplateTest.php | 13 ++++--------- .../ReportTemplates/UpdateReportTemplateTest.php | 13 ++++--------- 5 files changed, 17 insertions(+), 42 deletions(-) diff --git a/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php b/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php index 52f4ad888dfa..2b108443a3d4 100644 --- a/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php @@ -16,7 +16,7 @@ public function testRequiresPermission() $reportTemplate = ReportTemplate::factory()->create(); $this->actingAs(User::factory()->create()) - ->post($this->getRoute($reportTemplate)) + ->post(route('report-templates.destroy', $reportTemplate->id)) ->assertNotFound(); $this->assertModelExists($reportTemplate); @@ -27,7 +27,7 @@ public function testCannotDeleteAnotherUsersReportTemplate() $reportTemplate = ReportTemplate::factory()->create(); $this->actingAs(User::factory()->canViewReports()->create()) - ->delete($this->getRoute($reportTemplate)) + ->delete(route('report-templates.destroy', $reportTemplate->id)) ->assertNotFound(); $this->assertModelExists($reportTemplate); @@ -39,14 +39,9 @@ public function testCanDeleteAReportTemplate() $reportTemplate = ReportTemplate::factory()->for($user, 'creator')->create(); $this->actingAs($user) - ->delete($this->getRoute($reportTemplate)) + ->delete(route('report-templates.destroy', $reportTemplate->id)) ->assertRedirect(route('reports/custom')); $this->assertSoftDeleted($reportTemplate); } - - private function getRoute(ReportTemplate $reportTemplate): string - { - return route('report-templates.destroy', $reportTemplate->id); - } } diff --git a/tests/Feature/ReportTemplates/EditReportTemplateTest.php b/tests/Feature/ReportTemplates/EditReportTemplateTest.php index dad65ffbc886..88363ec8b1c1 100644 --- a/tests/Feature/ReportTemplates/EditReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/EditReportTemplateTest.php @@ -14,7 +14,7 @@ class EditReportTemplateTest extends TestCase implements TestsPermissionsRequire public function testRequiresPermission() { $this->actingAs(User::factory()->create()) - ->get($this->getRoute(ReportTemplate::factory()->create())) + ->get(route('report-templates.edit', ReportTemplate::factory()->create())) ->assertNotFound(); } @@ -24,7 +24,7 @@ public function testCannotLoadEditPageForAnotherUsersReportTemplate() $reportTemplate = ReportTemplate::factory()->create(); $this->actingAs($user) - ->get($this->getRoute($reportTemplate)) + ->get(route('report-templates.edit', $reportTemplate)) ->assertNotFound(); } @@ -34,12 +34,7 @@ public function testCanLoadEditReportTemplatePage() $reportTemplate = ReportTemplate::factory()->for($user, 'creator')->create(); $this->actingAs($user) - ->get($this->getRoute($reportTemplate)) + ->get(route('report-templates.edit', $reportTemplate)) ->assertOk(); } - - private function getRoute(ReportTemplate $reportTemplate): string - { - return route('report-templates.edit', $reportTemplate); - } } diff --git a/tests/Feature/ReportTemplates/ShowReportTemplateTest.php b/tests/Feature/ReportTemplates/ShowReportTemplateTest.php index dfd7d68bcbe8..3e57db898ad6 100644 --- a/tests/Feature/ReportTemplates/ShowReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/ShowReportTemplateTest.php @@ -14,7 +14,7 @@ class ShowReportTemplateTest extends TestCase implements TestsPermissionsRequire public function testRequiresPermission() { $this->actingAs(User::factory()->create()) - ->get($this->getRoute(ReportTemplate::factory()->create())) + ->get(route('report-templates.show', ReportTemplate::factory()->create())) ->assertNotFound(); } @@ -25,7 +25,7 @@ public function testCanLoadASavedReportTemplate() $user->reportTemplates()->save($reportTemplate); $this->actingAs($user) - ->get($this->getRoute($reportTemplate)) + ->get(route('report-templates.show', $reportTemplate)) ->assertOk() ->assertViewHas(['template' => function (ReportTemplate $templatePassedToView) use ($reportTemplate) { return $templatePassedToView->is($reportTemplate); @@ -37,12 +37,7 @@ public function testCannotLoadAnotherUsersSavedReportTemplate() $reportTemplate = ReportTemplate::factory()->create(); $this->actingAs(User::factory()->canViewReports()->create()) - ->get($this->getRoute($reportTemplate)) + ->get(route('report-templates.show', $reportTemplate)) ->assertNotFound(); } - - private function getRoute(ReportTemplate $reportTemplate): string - { - return route('report-templates.show', $reportTemplate); - } } diff --git a/tests/Feature/ReportTemplates/StoreReportTemplateTest.php b/tests/Feature/ReportTemplates/StoreReportTemplateTest.php index 492f5e4ecc3b..06121711e8df 100644 --- a/tests/Feature/ReportTemplates/StoreReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/StoreReportTemplateTest.php @@ -14,14 +14,14 @@ class StoreReportTemplateTest extends TestCase implements TestsPermissionsRequir public function testRequiresPermission() { $this->actingAs(User::factory()->create()) - ->post($this->getRoute()) + ->post(route('report-templates.store')) ->assertForbidden(); } public function testSavingReportTemplateRequiresValidFields() { $this->actingAs(User::factory()->canViewReports()->create()) - ->post($this->getRoute(), [ + ->post(route('report-templates.store'), [ 'name' => '', ]) ->assertSessionHasErrors('name'); @@ -33,7 +33,7 @@ public function testRedirectingAfterValidationErrorRestoresInputs() // start on the custom report page ->from(route('reports/custom')) ->followingRedirects() - ->post($this->getRoute(), [ + ->post(route('report-templates.store'), [ 'name' => '', // set some values to ensure they are still present // when returning to the custom report page. @@ -48,7 +48,7 @@ public function testCanSaveAReportTemplate() $user = User::factory()->canViewReports()->create(); $this->actingAs($user) - ->post($this->getRoute(), [ + ->post(route('report-templates.store'), [ 'name' => 'My Awesome Template', 'company' => '1', 'by_company_id' => ['1', '2'], @@ -63,9 +63,4 @@ public function testCanSaveAReportTemplate() $this->assertEquals('1', $template->options['company']); $this->assertEquals(['1', '2'], $template->options['by_company_id']); } - - private function getRoute(): string - { - return route('report-templates.store'); - } } diff --git a/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php b/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php index 8d4df153a6b5..9afecb084995 100644 --- a/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php @@ -14,14 +14,14 @@ class UpdateReportTemplateTest extends TestCase implements TestsPermissionsRequi public function testRequiresPermission() { $this->actingAs(User::factory()->create()) - ->post($this->getRoute(ReportTemplate::factory()->create())) + ->post(route('report-templates.update', ReportTemplate::factory()->create())) ->assertNotFound(); } public function testCannotUpdateAnotherUsersReportTemplate() { $this->actingAs(User::factory()->canViewReports()->create()) - ->post($this->getRoute(ReportTemplate::factory()->create())) + ->post(route('report-templates.update', ReportTemplate::factory()->create())) ->assertNotFound(); } @@ -32,7 +32,7 @@ public function testUpdatingReportTemplateRequiresValidFields() $reportTemplate = ReportTemplate::factory()->for($user, 'creator')->create(); $this->actingAs($user) - ->post($this->getRoute($reportTemplate), [ + ->post(route('report-templates.update', $reportTemplate), [ // ]) ->assertSessionHasErrors([ @@ -56,7 +56,7 @@ public function testCanUpdateAReportTemplate() ]); $this->actingAs($user) - ->post($this->getRoute($reportTemplate), [ + ->post(route('report-templates.update', $reportTemplate), [ 'name' => 'Updated Name', 'id' => 1, 'company' => 1, @@ -71,9 +71,4 @@ public function testCanUpdateAReportTemplate() $this->assertEquals(1, $reportTemplate->checkmarkValue('company')); $this->assertEquals([3], $reportTemplate->selectValues('by_company_id')); } - - private function getRoute(ReportTemplate $reportTemplate): string - { - return route('report-templates.update', $reportTemplate); - } } From 4bb19152c4a9329649ade50ec5ad688e7a78a2b2 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Thu, 7 Nov 2024 17:01:47 -0800 Subject: [PATCH 167/169] Move test --- tests/Feature/Reporting/CustomReportTest.php | 22 +++++++++++++ .../ReportTemplateScopingTest.php | 31 ------------------- 2 files changed, 22 insertions(+), 31 deletions(-) delete mode 100644 tests/Unit/Models/ReportTemplates/ReportTemplateScopingTest.php diff --git a/tests/Feature/Reporting/CustomReportTest.php b/tests/Feature/Reporting/CustomReportTest.php index 91d627129d08..0f53bd4efc92 100644 --- a/tests/Feature/Reporting/CustomReportTest.php +++ b/tests/Feature/Reporting/CustomReportTest.php @@ -6,6 +6,7 @@ use App\Models\Company; use App\Models\ReportTemplate; use App\Models\User; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Testing\TestResponse; use League\Csv\Reader; use PHPUnit\Framework\Assert; @@ -67,6 +68,27 @@ public function testCanLoadCustomReportPage() ]); } + public function testSavedTemplatesOnPageAreScopedToTheUser() + { + // Given there is a saved template for one user + ReportTemplate::factory()->create(['name' => 'Report A']); + + // When loading reports/custom while acting as another user that also has a saved template + $user = User::factory()->canViewReports() + ->has(ReportTemplate::factory(['name' => 'Report B'])) + ->create(); + + // The user should not see the other user's template (in view as 'report_templates') + $this->actingAs($user) + ->get(route('reports/custom')) + ->assertViewHas([ + 'report_templates' => function (Collection $reports) { + return $reports->pluck('name')->doesntContain('Report A'); + } + ]); + } + + public function testCustomAssetReport() { Asset::factory()->create(['name' => 'Asset A']); diff --git a/tests/Unit/Models/ReportTemplates/ReportTemplateScopingTest.php b/tests/Unit/Models/ReportTemplates/ReportTemplateScopingTest.php deleted file mode 100644 index 67052f7d4f94..000000000000 --- a/tests/Unit/Models/ReportTemplates/ReportTemplateScopingTest.php +++ /dev/null @@ -1,31 +0,0 @@ -create(['name' => 'Report A']); - - // When loading reports/custom while acting as another user that also has a saved template - $user = User::factory()->canViewReports() - ->has(ReportTemplate::factory(['name' => 'Report B'])) - ->create(); - - // The user should not see the other user's template (in view as 'report_templates') - $this->actingAs($user) - ->get(route('reports/custom')) - ->assertViewHas(['report_templates' => function (Collection $reports) { - return $reports->pluck('name')->doesntContain('Report A'); - }]); - } -} From 7373e2019cb8dba9cf05fd1e69eddc26abd57b41 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 12 Nov 2024 10:01:32 -0800 Subject: [PATCH 168/169] Improve comment --- app/Models/ReportTemplate.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Models/ReportTemplate.php b/app/Models/ReportTemplate.php index 0770eafc495b..06f0370a0067 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -109,8 +109,11 @@ public function checkmarkValue(string $fieldName, string $fallbackValue = '1'): return $fallbackValue; } - // Return the field's value if it exists and return 0 - // if not so that checkboxes are unchecked by default. + // If the model does exist then return the value of the field + // or return 0 so the checkbox is unchecked. + // Falling back to 0 here is because checkboxes are not sent + // in the request when unchecked so they are not + // actually saved in the model's options. return $this->options[$fieldName] ?? '0'; } From 5574c5fa49e578546532a08ccb74865b55fbe0b3 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 12 Nov 2024 10:35:22 -0800 Subject: [PATCH 169/169] Improve comments --- .../ReportTemplateParsingValuesTest.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/Unit/Models/ReportTemplates/ReportTemplateParsingValuesTest.php b/tests/Unit/Models/ReportTemplates/ReportTemplateParsingValuesTest.php index 2973b3b80825..91bd8979d0f3 100644 --- a/tests/Unit/Models/ReportTemplates/ReportTemplateParsingValuesTest.php +++ b/tests/Unit/Models/ReportTemplates/ReportTemplateParsingValuesTest.php @@ -15,22 +15,23 @@ public function testParsingValuesOnNonExistentReportTemplate() { $unsavedTemplate = new ReportTemplate; - // checkmarkValue() + // checkmarkValue() should be "checked" (1) by default $this->assertEquals('1', $unsavedTemplate->checkmarkValue('is_a_checkbox_field')); - // radioValue() + // radioValue() defaults to false but can be overridden $this->assertFalse($unsavedTemplate->radioValue('value_on_unsaved_template', 'can_be_anything')); $this->assertTrue($unsavedTemplate->radioValue('value_on_unsaved_template', 'can_be_anything', true)); - // selectValue() + // selectValue() should be null by default $this->assertNull($unsavedTemplate->selectValue('value_on_unsaved_template')); $this->assertNull($unsavedTemplate->selectValue('value_on_unsaved_template'), Location::class); - // selectValues() + // selectValues() should be an empty array by default + $this->assertIsArray($unsavedTemplate->selectValues('value_on_unsaved_template')); $this->assertEmpty($unsavedTemplate->selectValues('value_on_unsaved_template')); $this->assertEmpty($unsavedTemplate->selectValues('value_on_unsaved_template'), Location::class); - // textValue() + // textValue() should be an empty string by default $this->assertEquals('', $unsavedTemplate->selectValue('value_on_unsaved_template')); } @@ -48,7 +49,7 @@ public function testParsingCheckmarkValue() $this->assertEquals('1', $template->checkmarkValue('is_a_checkbox_field')); $this->assertEquals('0', $template->checkmarkValue('non_existent_key')); $this->assertEquals('0', $template->checkmarkValue('is_checkbox_field_with_zero')); - $this->assertEquals('0', (new ReportTemplate)->checkmarkValue('non_existent_key', '0')); + $this->assertEquals('0', (new ReportTemplate)->checkmarkValue('non_existent_key_that_is_overwritten_to_default_to_zero', '0')); } public function testParsingTextValue() @@ -77,7 +78,7 @@ public function testParsingRadioValue() // check non-existent key returns false $this->assertFalse($template->radioValue('non_existent_property', 'doesnt_matter')); - // check default returns true + // check can return fallback value $this->assertTrue($template->radioValue('non_existent_property', 'doesnt_matter', true)); }