From 24d8f74a3067b1291c710e8da2a6b8487b065ae1 Mon Sep 17 00:00:00 2001 From: Mazarin Date: Sat, 10 Sep 2022 16:53:51 -0400 Subject: [PATCH] feat: limit number of items appearing in feed (#210) --- .../Web/ViewHelpers/ContactShowViewHelper.php | 14 ++-- .../Web/Controllers/ContactFeedController.php | 30 ++++++++ .../Web/ViewHelpers/ModuleFeedViewHelper.php | 3 +- .../Web/Controllers/VaultController.php | 15 +--- .../Web/Controllers/VaultFeedController.php | 33 +++++++++ lang/en/app.php | 1 + lang/fr/app.php | 1 + resources/js/Pages/Vault/Contact/Show.vue | 2 +- resources/js/Pages/Vault/Dashboard/Index.vue | 6 +- .../Dashboard/Partials/UpcomingReminders.vue | 2 +- resources/js/Shared/Modules/Feed.vue | 68 +++++++++++++++++-- routes/web.php | 14 ++++ .../ViewHelpers/ModuleFeedViewHelperTest.php | 2 +- 13 files changed, 158 insertions(+), 33 deletions(-) create mode 100644 domains/Contact/ManageContactFeed/Web/Controllers/ContactFeedController.php create mode 100644 domains/Vault/ManageVault/Web/Controllers/VaultFeedController.php diff --git a/domains/Contact/ManageContact/Web/ViewHelpers/ContactShowViewHelper.php b/domains/Contact/ManageContact/Web/ViewHelpers/ContactShowViewHelper.php index 998a47ec0..bfee904e7 100644 --- a/domains/Contact/ManageContact/Web/ViewHelpers/ContactShowViewHelper.php +++ b/domains/Contact/ManageContact/Web/ViewHelpers/ContactShowViewHelper.php @@ -5,7 +5,6 @@ use App\Contact\ManageAvatar\Web\ViewHelpers\ModuleAvatarViewHelper; use App\Contact\ManageCalls\Web\ViewHelpers\ModuleCallsViewHelper; use App\Contact\ManageContactAddresses\Web\ViewHelpers\ModuleContactAddressesViewHelper; -use App\Contact\ManageContactFeed\Web\ViewHelpers\ModuleFeedViewHelper; use App\Contact\ManageContactImportantDates\Web\ViewHelpers\ModuleImportantDatesViewHelper; use App\Contact\ManageContactInformation\Web\ViewHelpers\ModuleContactInformationViewHelper; use App\Contact\ManageContactName\Web\ViewHelpers\ModuleContactNameViewHelper; @@ -26,7 +25,6 @@ use App\Contact\ManageTasks\Web\ViewHelpers\ModuleContactTasksViewHelper; use App\Helpers\StorageHelper; use App\Models\Contact; -use App\Models\ContactFeedItem; use App\Models\Module; use App\Models\TemplatePage; use App\Models\User; @@ -226,12 +224,12 @@ public static function modules(TemplatePage $page, Contact $contact, User $user) } if ($module->type == Module::TYPE_FEED) { - $items = ContactFeedItem::where('contact_id', $contact->id) - ->with('author') - ->with('contact') - ->orderBy('created_at', 'desc') - ->get(); - $data = ModuleFeedViewHelper::data($items, $user); + // this is the only module where the data is loaded asynchroniously + // so it needs an URL to load the data from + $data = route('contact.feed.show', [ + 'vault' => $contact->vault_id, + 'contact' => $contact->id, + ]); } if ($module->type == Module::TYPE_REMINDERS) { diff --git a/domains/Contact/ManageContactFeed/Web/Controllers/ContactFeedController.php b/domains/Contact/ManageContactFeed/Web/Controllers/ContactFeedController.php new file mode 100644 index 000000000..72c74321f --- /dev/null +++ b/domains/Contact/ManageContactFeed/Web/Controllers/ContactFeedController.php @@ -0,0 +1,30 @@ +with('author') + ->with('contact') + ->orderBy('created_at', 'desc') + ->paginate(15); + + $vault = Vault::find($vaultId); + + return response()->json([ + 'data' => ModuleFeedViewHelper::data($items, Auth::user(), $vault), + 'paginator' => PaginatorHelper::getData($items), + ], 200); + } +} diff --git a/domains/Contact/ManageContactFeed/Web/ViewHelpers/ModuleFeedViewHelper.php b/domains/Contact/ManageContactFeed/Web/ViewHelpers/ModuleFeedViewHelper.php index 168f644a5..753004b09 100644 --- a/domains/Contact/ManageContactFeed/Web/ViewHelpers/ModuleFeedViewHelper.php +++ b/domains/Contact/ManageContactFeed/Web/ViewHelpers/ModuleFeedViewHelper.php @@ -11,10 +11,11 @@ use App\Helpers\UserHelper; use App\Models\ContactFeedItem; use App\Models\User; +use App\Models\Vault; class ModuleFeedViewHelper { - public static function data($items, User $user): array + public static function data($items, User $user, Vault $vault): array { $itemsCollection = $items->map(function ($item) use ($user) { return [ diff --git a/domains/Vault/ManageVault/Web/Controllers/VaultController.php b/domains/Vault/ManageVault/Web/Controllers/VaultController.php index 454901646..04b52b6cd 100644 --- a/domains/Vault/ManageVault/Web/Controllers/VaultController.php +++ b/domains/Vault/ManageVault/Web/Controllers/VaultController.php @@ -2,10 +2,7 @@ namespace App\Vault\ManageVault\Web\Controllers; -use App\Contact\ManageContactFeed\Web\ViewHelpers\ModuleFeedViewHelper; use App\Http\Controllers\Controller; -use App\Models\Contact; -use App\Models\ContactFeedItem; use App\Models\Vault; use App\Vault\ManageVault\Services\CreateVault; use App\Vault\ManageVault\Services\DestroyVault; @@ -55,21 +52,15 @@ public function show(Request $request, int $vaultId) { $vault = Vault::find($vaultId); - $contactIds = Contact::where('vault_id', $vaultId)->select('id')->get()->toArray(); - - $items = ContactFeedItem::whereIn('contact_id', $contactIds) - ->with('author') - ->with('contact') - ->orderBy('created_at', 'desc') - ->get(); - return Inertia::render('Vault/Dashboard/Index', [ 'layoutData' => VaultIndexViewHelper::layoutData($vault), 'lastUpdatedContacts' => VaultShowViewHelper::lastUpdatedContacts($vault), 'upcomingReminders' => VaultShowViewHelper::upcomingReminders($vault, Auth::user()), 'favorites' => VaultShowViewHelper::favorites($vault, Auth::user()), - 'feed' => ModuleFeedViewHelper::data($items, Auth::user()), 'dueTasks' => VaultShowViewHelper::dueTasks($vault, Auth::user()), + 'loadFeedUrl' => route('vault.feed.show', [ + 'vault' => $vaultId, + ]), ]); } diff --git a/domains/Vault/ManageVault/Web/Controllers/VaultFeedController.php b/domains/Vault/ManageVault/Web/Controllers/VaultFeedController.php new file mode 100644 index 000000000..e40408a31 --- /dev/null +++ b/domains/Vault/ManageVault/Web/Controllers/VaultFeedController.php @@ -0,0 +1,33 @@ +select('id')->get()->toArray(); + + $items = ContactFeedItem::whereIn('contact_id', $contactIds) + ->with('author') + ->with('contact') + ->orderBy('created_at', 'desc') + ->paginate(15); + + return response()->json([ + 'data' => ModuleFeedViewHelper::data($items, Auth::user(), $vault), + 'paginator' => PaginatorHelper::getData($items), + ], 200); + } +} diff --git a/lang/en/app.php b/lang/en/app.php index 03bfa6299..9235e8a7b 100644 --- a/lang/en/app.php +++ b/lang/en/app.php @@ -65,6 +65,7 @@ 'next' => 'Next', 'view_all' => 'View all', 'view_map' => 'View on map', + 'view_older' => 'Load previous entries', 'download' => 'Download', 'unknown_name' => 'Unknown name', diff --git a/lang/fr/app.php b/lang/fr/app.php index 9ab4b9c86..2e79291fe 100644 --- a/lang/fr/app.php +++ b/lang/fr/app.php @@ -65,6 +65,7 @@ 'next' => 'Suivant', 'view_all' => 'Tout voir', 'view_map' => 'Voir sur la carte', + 'view_older' => 'Voir les entrées précédentes', 'download' => 'Télécharger', 'unknown_name' => 'Nom non renseigné', diff --git a/resources/js/Pages/Vault/Contact/Show.vue b/resources/js/Pages/Vault/Contact/Show.vue index 44d8af880..754a117ff 100644 --- a/resources/js/Pages/Vault/Contact/Show.vue +++ b/resources/js/Pages/Vault/Contact/Show.vue @@ -152,7 +152,7 @@ - + diff --git a/resources/js/Pages/Vault/Dashboard/Index.vue b/resources/js/Pages/Vault/Dashboard/Index.vue index 334dbaf91..428e281ae 100644 --- a/resources/js/Pages/Vault/Dashboard/Index.vue +++ b/resources/js/Pages/Vault/Dashboard/Index.vue @@ -58,7 +58,7 @@ - +
@@ -156,8 +156,8 @@ export default { type: Object, default: null, }, - feed: { - type: Object, + loadFeedUrl: { + type: String, default: null, }, dueTasks: { diff --git a/resources/js/Pages/Vault/Dashboard/Partials/UpcomingReminders.vue b/resources/js/Pages/Vault/Dashboard/Partials/UpcomingReminders.vue index 1b76cba22..c8591e02a 100644 --- a/resources/js/Pages/Vault/Dashboard/Partials/UpcomingReminders.vue +++ b/resources/js/Pages/Vault/Dashboard/Partials/UpcomingReminders.vue @@ -48,7 +48,7 @@
+ class="mb-4 rounded-lg border border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-900">

{{ $t('vault.dashboard_reminders_blank') }}

diff --git a/resources/js/Shared/Modules/Feed.vue b/resources/js/Shared/Modules/Feed.vue index ce3852547..87e0d6ac6 100644 --- a/resources/js/Shared/Modules/Feed.vue +++ b/resources/js/Shared/Modules/Feed.vue @@ -1,7 +1,7 @@ diff --git a/routes/web.php b/routes/web.php index 64a9dbd82..ef3e3a754 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,6 +11,7 @@ use App\Contact\ManageContact\Web\Controllers\ContactTemplateController; use App\Contact\ManageContactAddresses\Web\Controllers\ContactModuleAddressController; use App\Contact\ManageContactAddresses\Web\Controllers\ContactModuleAddressImageController; +use App\Contact\ManageContactFeed\Web\Controllers\ContactFeedController; use App\Contact\ManageContactImportantDates\Web\Controllers\ContactImportantDatesController; use App\Contact\ManageContactInformation\Web\Controllers\ContactInformationController; use App\Contact\ManageDocuments\Web\Controllers\ContactModuleDocumentController; @@ -85,6 +86,7 @@ use App\Vault\ManageFiles\Web\Controllers\VaultFileController; use App\Vault\ManageTasks\Web\Controllers\VaultTaskController; use App\Vault\ManageVault\Web\Controllers\VaultController; +use App\Vault\ManageVault\Web\Controllers\VaultFeedController; use App\Vault\ManageVault\Web\Controllers\VaultReminderController; use App\Vault\ManageVaultSettings\Web\Controllers\VaultSettingsContactImportantDateTypeController; use App\Vault\ManageVaultSettings\Web\Controllers\VaultSettingsController; @@ -128,6 +130,9 @@ // reminders Route::get('reminders', [VaultReminderController::class, 'index'])->name('vault.reminder.index'); + // vault feed entries + Route::get('feed', [VaultFeedController::class, 'show'])->name('vault.feed.show'); + // tasks Route::get('tasks', [VaultTaskController::class, 'index'])->name('vault.tasks.index'); @@ -142,21 +147,30 @@ // contact page Route::middleware(['contact'])->prefix('{contact}')->group(function () { + // general page information Route::get('', [ContactController::class, 'show'])->name('contact.show'); Route::get('/edit', [ContactController::class, 'edit'])->name('contact.edit'); Route::post('', [ContactController::class, 'update'])->name('contact.update'); Route::delete('', [ContactController::class, 'destroy'])->name('contact.destroy'); + + // toggle archive/favorite Route::put('/toggle', [ContactArchiveController::class, 'update'])->name('contact.archive.update'); Route::put('/toggle-favorite', [ContactFavoriteController::class, 'update'])->name('contact.favorite.update'); + + // template Route::get('update-template', [ContactNoTemplateController::class, 'show'])->name('contact.blank'); Route::put('template', [ContactTemplateController::class, 'update'])->name('contact.template.update'); + // get the proper tab Route::get('tabs/{slug}', [ContactPageController::class, 'show'])->name('contact.page.show'); // avatar Route::put('avatar', [ModuleAvatarController::class, 'update'])->name('contact.avatar.update'); Route::delete('avatar', [ModuleAvatarController::class, 'destroy'])->name('contact.avatar.destroy'); + // contact feed entries + Route::get('feed', [ContactFeedController::class, 'show'])->name('contact.feed.show'); + // important dates Route::get('dates', [ContactImportantDatesController::class, 'index'])->name('contact.date.index'); Route::post('dates', [ContactImportantDatesController::class, 'store'])->name('contact.date.store'); diff --git a/tests/Unit/Domains/Contact/ManageContactFeed/Web/ViewHelpers/ModuleFeedViewHelperTest.php b/tests/Unit/Domains/Contact/ManageContactFeed/Web/ViewHelpers/ModuleFeedViewHelperTest.php index 0dfbd1f87..3a52ca7f6 100644 --- a/tests/Unit/Domains/Contact/ManageContactFeed/Web/ViewHelpers/ModuleFeedViewHelperTest.php +++ b/tests/Unit/Domains/Contact/ManageContactFeed/Web/ViewHelpers/ModuleFeedViewHelperTest.php @@ -27,7 +27,7 @@ public function it_gets_the_data_needed_for_the_view(): void ->orderBy('created_at', 'desc') ->get(); - $array = ModuleFeedViewHelper::data($items, $user); + $array = ModuleFeedViewHelper::data($items, $user, $contact->vault); $this->assertEquals( 1,