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 344d5c8743..6d0b0e0055 100644 --- a/resources/lang/en/admin/reports/general.php +++ b/resources/lang/en/admin/reports/general.php @@ -6,5 +6,9 @@ return [ '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 ff78f21686..6d7233dc82 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 0000000000..330aa9c645 --- /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 330aa9c645..3f625dcab7 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/SavedReport.php @@ -8,4 +8,16 @@ use Illuminate\Database\Eloquent\Model; 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 603030cfe9..2065880095 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 @@ class CreateSavedReportsTable extends Migration { 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 c9a88ea0f1..a04cd8356b 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -11,6 +11,7 @@ use App\Models\CheckoutAcceptance; 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 @@ class ReportsController extends Controller { $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 0000000000..b55838708f --- /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 3f625dcab7..cd1cdd7e58 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 6d7233dc82..3a9e3a3a5c 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 4bc8b3bb58..8da447916a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -16,6 +16,7 @@ use App\Http\Controllers\ManufacturersController; 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 @@ Route::group(['middleware' => ['auth']], function () { )->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 b55838708f..a9917f5d96 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 3a9e3a3a5c..5944ec7e38 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 5944ec7e38..7a38679057 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 0000000000..c4221ea817 --- /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 7a38679057..78c07c519b 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 78c07c519b..f8427f646b 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 a04cd8356b..4b4db866ac 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -407,6 +407,7 @@ class ReportsController extends Controller */ 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 519e07b79b..31b91f0347 100644 --- a/app/Http/Controllers/SavedReportsController.php +++ b/app/Http/Controllers/SavedReportsController.php @@ -6,13 +6,8 @@ use Illuminate\Http\Request; 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 f8427f646b..94bdc37879 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 4b4db866ac..d60e201e77 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -394,7 +394,13 @@ class ReportsController extends Controller $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 31b91f0347..fcb9b54604 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 cd1cdd7e58..81c5b9a66c 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 0000000000..72279bd3e5 --- /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 94bdc37879..b9ce08a8c3 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 0000000000..a99408a846 --- /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 a99408a846..fad10abbb9 100644 --- a/tests/Unit/SavedReportTest.php +++ b/tests/Unit/SavedReportTest.php @@ -34,4 +34,18 @@ class SavedReportTest extends TestCase $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 | 45 ++++++++++++++++--- 11 files changed, 145 insertions(+), 16 deletions(-) diff --git a/app/Models/SavedReport.php b/app/Models/SavedReport.php index 81c5b9a66c..afefc37ba3 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 @@ class SavedReport extends Model 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 684b8d76da..ea473d9c5e 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 bf00e0ce23..ba098d78a5 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -397,9 +397,7 @@ class ReportsController extends Controller 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 a28af2aa9e..603cb76c08 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 787e31e825..2a5d59ff72 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 98a3ec346b..95713fb655 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -14,6 +14,7 @@ use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; 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 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo 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 48138dc62f..3c007af500 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 ba098d78a5..1df676067b 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -386,7 +386,7 @@ class ReportsController extends Controller * @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 0000000000..7c465beae8 --- /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 603cb76c08..ddc611539c 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 8da447916a..14d98d7318 100644 --- a/routes/web.php +++ b/routes/web.php @@ -357,6 +357,7 @@ Route::group(['middleware' => ['auth']], function () { )->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 7c465beae8..c95da4feaf 100644 --- a/tests/Feature/SavedReports/SavedReportsTest.php +++ b/tests/Feature/SavedReports/SavedReportsTest.php @@ -49,4 +49,22 @@ class SavedReportsTest extends TestCase { $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 1df676067b..9ff7108280 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -392,7 +392,7 @@ class ReportsController extends Controller { $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 ddc611539c..92687f323d 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 @@ class SavedReportsController extends Controller { $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 2a5d59ff72..dab8486a6e 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/SavedReport.php @@ -4,10 +4,12 @@ namespace App\Models; 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 3c007af500..219fc79aa5 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 f86d9b286d..b4aafaf011 100644 --- a/routes/web.php +++ b/routes/web.php @@ -359,7 +359,9 @@ Route::group(['middleware' => ['auth']], function () { 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 487ded803a..5671cef244 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 @@ class SavedReportsController extends Controller 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 @@ class SavedReportsController extends Controller $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 9ff7108280..864e889653 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -11,7 +11,7 @@ use App\Models\CheckoutAcceptance; 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 @@ class ReportsController extends Controller { $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 806c9dab99..6ea8dd95ab 100644 --- a/app/Models/SavedReport.php +++ b/app/Models/ReportTemplate.php @@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; 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 95713fb655..8355189b14 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -330,9 +330,9 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo 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 72279bd3e5..1ece94e410 100644 --- a/database/factories/SavedReportFactory.php +++ b/database/factories/ReportTemplateFactory.php @@ -4,7 +4,7 @@ namespace Database\Factories; 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 2065880095..31615b6fe4 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\Migrations\Migration; 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 @@ class CreateSavedReportsTable extends Migration */ 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 29a9511bd9..016020a508 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 @@

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

@@ -274,7 +274,7 @@ @foreach ($customfields as $customfield) @@ -290,21 +290,21 @@
- @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 @@
- + to - +
@@ -322,9 +322,9 @@
- + to - +
@@ -332,9 +332,9 @@
- + to - +
@@ -342,9 +342,9 @@
- + to - +
@@ -352,9 +352,9 @@
- + to - +
@@ -362,36 +362,36 @@
- + to - +
@@ -411,12 +411,12 @@
- @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 @@
- {{-- --}} - {{-- {{ 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 @@ {{-- --}} -{{-- --}} +{{-- --}} {{-- @csrf--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- --}} @@ -529,7 +524,7 @@ 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 b4aafaf011..d23bf83e46 100644 --- a/routes/web.php +++ b/routes/web.php @@ -16,7 +16,7 @@ use App\Http\Controllers\ManufacturersController; 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 @@ Route::group(['middleware' => ['auth']], function () { )->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 c68e99688d..92a6ac696d 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 @@ class SavedReportsTest extends TestCase 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 @@ class SavedReportsTest extends TestCase $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 @@ class SavedReportsTest extends TestCase 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 02b8876dd4..7af41710c7 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 @@ class SavedReportTest extends TestCase $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 @@ class SavedReportTest extends TestCase $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 @@ class SavedReportTest extends TestCase 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 @@ class SavedReportTest extends TestCase 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 5671cef244..718dd95f0e 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -18,6 +18,13 @@ class ReportTemplatesController extends Controller '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 864e889653..443245a716 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -411,7 +411,7 @@ class ReportsController extends Controller */ 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 d4c8f8198f..98e4ec195a 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 016020a508..9b569f5baa 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 @@ 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 @@
- {{ Form::close() }} {{--does this need to be at the bottom of all our new stuff?--}} + {{ Form::close() }}
@@ -416,7 +424,7 @@
@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 @@ -{{-- @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 8e49672184..ce0a3abbb7 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -420,7 +420,7 @@
@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 718dd95f0e..faac516460 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -29,6 +29,27 @@ class ReportTemplatesController extends Controller 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 443245a716..5533b776bd 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -397,7 +397,7 @@ class ReportsController extends Controller 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 ce0a3abbb7..97f7ef088c 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -429,7 +429,7 @@ > @foreach($report_templates as $template) - @endforeach @@ -439,7 +439,7 @@ @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 faac516460..daefab2219 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -26,7 +26,7 @@ class ReportTemplatesController extends Controller // 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 @@ class ReportTemplatesController extends Controller ]); } - public function update(Request $request) + public function update(Request $request, $reportId) { - $this->authorize('update',ReportTemplate::class); + $this->authorize('reports.view'); - if(is_null($reportid = ReportTemplate::find($request))) - { + $reportTemplate = ReportTemplate::find($reportId); + + 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 c30ae2dfcb..83f4202979 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 83f4202979..d9da2d61d7 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 daefab2219..f4d9ac02fe 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -76,4 +76,22 @@ class ReportTemplatesController extends Controller 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 d9da2d61d7..305104c02d 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -47,26 +47,16 @@ {{ 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 @@ 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 7e19306c19..32263816aa 100644 --- a/routes/web.php +++ b/routes/web.php @@ -360,7 +360,8 @@ Route::group(['middleware' => ['auth']], function () { 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 f4d9ac02fe..d98d2777e4 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -18,18 +18,11 @@ class ReportTemplatesController extends Controller '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 @@ class ReportTemplatesController extends Controller ]); } - 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 @@ class ReportTemplatesController extends Controller $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 @@ class ReportTemplatesController extends Controller $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 305104c02d..c5e936393e 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -497,8 +497,6 @@ e.preventDefault(e); let form = $('#custom-report-form'); - {{-- handle null? --}} - {{-- handle duplicate name? --}} $('').attr({ type: 'hidden', name: 'name', @@ -514,6 +512,5 @@ $(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 1ece94e410..bb5cac5963 100644 --- a/database/factories/ReportTemplateFactory.php +++ b/database/factories/ReportTemplateFactory.php @@ -15,7 +15,7 @@ class ReportTemplateFactory extends Factory { return [ 'name' => $this->faker->word(), - 'options' => json_encode([]), + 'options' => [], ]; } } diff --git a/tests/Feature/ReportTemplates/ReportTemplateTest.php b/tests/Feature/ReportTemplates/ReportTemplateTest.php index 92a6ac696d..4a56f5eda6 100644 --- a/tests/Feature/ReportTemplates/ReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/ReportTemplateTest.php @@ -22,34 +22,34 @@ class ReportTemplateTest extends TestCase }]); } - 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 @@ class ReportTemplateTest extends TestCase $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 @@ class ReportTemplateTest extends TestCase ->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 c5e936393e..a3e397f8fb 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -423,7 +423,7 @@ - @endpush
@endif @if (request()->routeIs('reports/custom')) @@ -556,6 +544,14 @@ 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 d98d2777e4..56468403e8 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -30,7 +30,7 @@ class ReportTemplatesController extends Controller 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 cc87e1334d..0b7d515fb2 100644 --- a/resources/lang/en/admin/reports/general.php +++ b/resources/lang/en/admin/reports/general.php @@ -12,4 +12,5 @@ return [ '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 98e4ec195a..c52a2a003e 100644 --- a/resources/lang/en/admin/reports/message.php +++ b/resources/lang/en/admin/reports/message.php @@ -10,4 +10,6 @@ return array( ], '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 ed27c98609..6100511706 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -477,7 +477,7 @@
{{--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 56468403e8..684b9527cd 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -30,7 +30,7 @@ class ReportTemplatesController extends Controller 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 @@ class ReportTemplatesController extends Controller 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 @@ class ReportTemplatesController extends Controller 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 c52a2a003e..6c0c246183 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 @@ return array( '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 0b7d515fb2..37b1ca7b16 100644 --- a/resources/lang/en/admin/reports/general.php +++ b/resources/lang/en/admin/reports/general.php @@ -12,5 +12,5 @@ return [ '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 6c0c246183..5c5363ecee 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 6100511706..d5f55239d3 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -487,6 +487,13 @@
@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 d5f55239d3..d164bbae8d 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -488,9 +488,10 @@ @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 d164bbae8d..08d1c3bdc2 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -491,9 +491,10 @@

{{ 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 08d1c3bdc2..9817c3aaf5 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -455,6 +455,7 @@
@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 | 376 +++++++++++------------ tests/Unit/ReportTemplateTest.php | 1 - 2 files changed, 188 insertions(+), 189 deletions(-) diff --git a/resources/views/reports/custom.blade.php b/resources/views/reports/custom.blade.php index 20624eb4c9..92f831372a 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 @@
- -
+ +
{{ Form::close() }} -
+
@@ -488,12 +488,12 @@
-
-

{{ 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 @@ }); $("#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 @@ }); $('#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 d76f89fd5a..ff36175382 100644 --- a/tests/Unit/ReportTemplateTest.php +++ b/tests/Unit/ReportTemplateTest.php @@ -99,7 +99,6 @@ class ReportTemplateTest extends TestCase $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 dadff6a27b..0ec2f854c4 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -36,7 +36,9 @@ class ReportTemplate extends Model { // 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 ff36175382..465f167adb 100644 --- a/tests/Unit/ReportTemplateTest.php +++ b/tests/Unit/ReportTemplateTest.php @@ -131,11 +131,6 @@ class ReportTemplateTest extends TestCase $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 @@ class ReportTemplateTest extends TestCase $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 @@ class ReportTemplateTest extends TestCase '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 938a191a28..c4a0a0b03c 100644 --- a/resources/lang/en/admin/reports/general.php +++ b/resources/lang/en/admin/reports/general.php @@ -9,8 +9,9 @@ return [ '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 92f831372a..7fd0e9f845 100644 --- a/resources/views/reports/custom.blade.php +++ b/resources/views/reports/custom.blade.php @@ -460,8 +460,9 @@ + @@ -349,9 +349,9 @@
- + to - +
@@ -359,9 +359,9 @@
- + to - +
@@ -369,9 +369,9 @@
- + to - +
@@ -379,9 +379,9 @@
- + to - +
@@ -389,9 +389,9 @@
- + to - +
@@ -399,36 +399,36 @@
- + to - +
@@ -480,7 +480,7 @@
- + {!! $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 c8c7740c53..d13c2a35a5 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 6b8fe33a2e..a05e477b37 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -55,6 +55,9 @@ class ReportTemplatesController extends Controller { $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 c992e2e116..ea22b07dfe 100644 --- a/resources/lang/en-US/admin/reports/general.php +++ b/resources/lang/en-US/admin/reports/general.php @@ -17,6 +17,6 @@ return [ '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 d13c2a35a5..1f0d6fd812 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 @@ class UpdateReportTemplateTest extends TestCase implements TestsPermissionsRequi $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 a05e477b37..27d56369de 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -15,10 +15,10 @@ class ReportTemplatesController extends Controller $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 @@ class ReportTemplatesController extends Controller { $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 2be8ea3ed4..d1a00c5657 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 5c94fd3e2c..8d4df153a6 100644 --- a/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/UpdateReportTemplateTest.php @@ -25,6 +25,21 @@ class UpdateReportTemplateTest extends TestCase implements TestsPermissionsRequi ->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 27d56369de..2be1da99e0 100644 --- a/app/Http/Controllers/ReportTemplatesController.php +++ b/app/Http/Controllers/ReportTemplatesController.php @@ -58,9 +58,10 @@ class ReportTemplatesController extends Controller // 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 1f0d6fd812..e817fde5db 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 e817fde5db..3ab43ed6b3 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 d1a00c5657..90b83cba54 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -6,11 +6,13 @@ use Illuminate\Database\Eloquent\Builder; 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 0ca44f0070..d9438f2cc8 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 @@ class CreateReportTemplatesTable extends Migration $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 e77942256f..52f4ad888d 100644 --- a/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php @@ -42,7 +42,7 @@ class DeleteReportTemplateTest extends TestCase implements TestsPermissionsRequi ->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 90b83cba54..0770eafc49 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 373df56413..86cc27f64d 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -398,11 +398,12 @@ class ReportsController extends Controller $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 52f4ad888d..2b108443a3 100644 --- a/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php +++ b/tests/Feature/ReportTemplates/DeleteReportTemplateTest.php @@ -16,7 +16,7 @@ class DeleteReportTemplateTest extends TestCase implements TestsPermissionsRequi $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 @@ class DeleteReportTemplateTest extends TestCase implements TestsPermissionsRequi $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 @@ class DeleteReportTemplateTest extends TestCase implements TestsPermissionsRequi $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 dad65ffbc8..88363ec8b1 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 @@ class EditReportTemplateTest extends TestCase implements TestsPermissionsRequire $reportTemplate = ReportTemplate::factory()->create(); $this->actingAs($user) - ->get($this->getRoute($reportTemplate)) + ->get(route('report-templates.edit', $reportTemplate)) ->assertNotFound(); } @@ -34,12 +34,7 @@ class EditReportTemplateTest extends TestCase implements TestsPermissionsRequire $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 dfd7d68bcb..3e57db898a 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 @@ class ShowReportTemplateTest extends TestCase implements TestsPermissionsRequire $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 @@ class ShowReportTemplateTest extends TestCase implements TestsPermissionsRequire $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 492f5e4ecc..06121711e8 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 @@ class StoreReportTemplateTest extends TestCase implements TestsPermissionsRequir // 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 @@ class StoreReportTemplateTest extends TestCase implements TestsPermissionsRequir $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 @@ class StoreReportTemplateTest extends TestCase implements TestsPermissionsRequir $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 8d4df153a6..9afecb0849 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 @@ class UpdateReportTemplateTest extends TestCase implements TestsPermissionsRequi $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 @@ class UpdateReportTemplateTest extends TestCase implements TestsPermissionsRequi ]); $this->actingAs($user) - ->post($this->getRoute($reportTemplate), [ + ->post(route('report-templates.update', $reportTemplate), [ 'name' => 'Updated Name', 'id' => 1, 'company' => 1, @@ -71,9 +71,4 @@ class UpdateReportTemplateTest extends TestCase implements TestsPermissionsRequi $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 91d627129d..0f53bd4efc 100644 --- a/tests/Feature/Reporting/CustomReportTest.php +++ b/tests/Feature/Reporting/CustomReportTest.php @@ -6,6 +6,7 @@ use App\Models\Asset; 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 @@ class CustomReportTest extends TestCase implements TestsPermissionsRequirement ]); } + 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 67052f7d4f..0000000000 --- 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 0770eafc49..06f0370a00 100644 --- a/app/Models/ReportTemplate.php +++ b/app/Models/ReportTemplate.php @@ -109,8 +109,11 @@ class ReportTemplate extends Model 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 2973b3b808..91bd8979d0 100644 --- a/tests/Unit/Models/ReportTemplates/ReportTemplateParsingValuesTest.php +++ b/tests/Unit/Models/ReportTemplates/ReportTemplateParsingValuesTest.php @@ -15,22 +15,23 @@ class ReportTemplateParsingValuesTest extends TestCase { $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 @@ class ReportTemplateParsingValuesTest extends TestCase $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 @@ class ReportTemplateParsingValuesTest extends TestCase // 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)); }