From c3a6f5d70321ed162d785803f63783237c155a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Carodej?= Date: Fri, 25 Feb 2022 09:42:55 +0100 Subject: [PATCH] UI enhancements for file request --- database/factories/UploadRequestFactory.php | 9 ++- ...17_073653_create_upload_requests_table.php | 3 +- .../Others/CreateUploadRequestPopup.vue | 42 +++++++++- .../js/components/Others/MoveItemPopup.vue | 2 +- .../components/Others/Popup/ConfirmPopup.vue | 2 +- resources/js/components/Others/TreeMenu.vue | 2 +- resources/js/views/Admin.vue | 10 ++- .../js/views/FileView/UploadRequestFiles.vue | 2 +- resources/js/views/Profile.vue | 8 ++ .../CreateUploadRequestController.php | 2 + .../UploadFilesForUploadRequestController.php | 4 +- .../Requests/StoreUploadRequest.php | 8 +- .../UploadRequest/UploadRequestTest.php | 77 ++++++++++++++++++- 13 files changed, 152 insertions(+), 19 deletions(-) diff --git a/database/factories/UploadRequestFactory.php b/database/factories/UploadRequestFactory.php index 4934db60..d38ee8f7 100644 --- a/database/factories/UploadRequestFactory.php +++ b/database/factories/UploadRequestFactory.php @@ -24,10 +24,11 @@ class UploadRequestFactory extends Factory return [ 'id' => $this->faker->uuid, 'user_id' => $this->faker->uuid, - 'folder_id' => $this->faker->uuid, - 'email' => $this->faker->email, - 'notes' => $this->faker->realText(80), - 'status' => $this->faker->randomElement( + 'folder_id' => $this->faker->uuid, + 'email' => $this->faker->email, + 'name' => $this->faker->name, + 'notes' => $this->faker->realText(80), + 'status' => $this->faker->randomElement( ['active', 'filled', 'expired'] ), 'created_at' => $this->faker->dateTimeBetween('-1 months'), diff --git a/database/migrations/2022_02_17_073653_create_upload_requests_table.php b/database/migrations/2022_02_17_073653_create_upload_requests_table.php index 4928ba9c..08ac829c 100644 --- a/database/migrations/2022_02_17_073653_create_upload_requests_table.php +++ b/database/migrations/2022_02_17_073653_create_upload_requests_table.php @@ -16,9 +16,10 @@ class CreateUploadRequestsTable extends Migration Schema::create('upload_requests', function (Blueprint $table) { $table->uuid('id'); $table->uuid('user_id'); - $table->uuid('folder_id'); + $table->uuid('folder_id')->nullable(); $table->enum('status', ['active', 'filling', 'filled', 'expired'])->default('active'); $table->string('email')->nullable(); + $table->text('name')->nullable(); $table->longText('notes')->nullable(); $table->timestamps(); $table->charset = 'utf8mb4'; diff --git a/resources/js/components/Others/CreateUploadRequestPopup.vue b/resources/js/components/Others/CreateUploadRequestPopup.vue index 93820dd0..f3d5f3c4 100644 --- a/resources/js/components/Others/CreateUploadRequestPopup.vue +++ b/resources/js/components/Others/CreateUploadRequestPopup.vue @@ -16,11 +16,12 @@ v-slot="{ invalid }" tag="form" > + - + @@ -44,6 +45,35 @@ + + + + + + + + + + + + @@ -124,9 +154,11 @@ export default { email: undefined, notes: undefined, folder_id: undefined, + name: undefined, }, generatedUploadRequest: undefined, shareViaEmail: false, + customFolderName: false, pickedItem: undefined, isLoading: false, } @@ -159,8 +191,10 @@ export default { }, created() { events.$on('popup:open', (args) => { - if (args.name === 'create-file-request') this.pickedItem = args.item - this.form.folder_id = args.item.data.id + if (args.name === 'create-file-request') + this.pickedItem = args.item + + this.form.folder_id = args.item?.data.id }) // Close popup @@ -172,8 +206,10 @@ export default { this.pickedItem = undefined this.shareViaEmail = false + this.customFolderName = false this.form = { + name: undefined, email: undefined, notes: undefined, folder_id: undefined, diff --git a/resources/js/components/Others/MoveItemPopup.vue b/resources/js/components/Others/MoveItemPopup.vue index 9481be1c..d56a6252 100644 --- a/resources/js/components/Others/MoveItemPopup.vue +++ b/resources/js/components/Others/MoveItemPopup.vue @@ -53,7 +53,7 @@ import ThumbnailItem from './ThumbnailItem' import ButtonBase from '../FilesView/ButtonBase' import Spinner from '../FilesView/Spinner' import TreeMenu from './TreeMenu' -import { isArray, isNull } from 'lodash' +import { isArray } from 'lodash' import { mapGetters } from 'vuex' import { events } from '../../bus' diff --git a/resources/js/components/Others/Popup/ConfirmPopup.vue b/resources/js/components/Others/Popup/ConfirmPopup.vue index 7e1f5ef3..2631eca4 100644 --- a/resources/js/components/Others/Popup/ConfirmPopup.vue +++ b/resources/js/components/Others/Popup/ConfirmPopup.vue @@ -2,7 +2,7 @@
- +

{{ title }} diff --git a/resources/js/components/Others/TreeMenu.vue b/resources/js/components/Others/TreeMenu.vue index e565f8b6..9bcecf89 100644 --- a/resources/js/components/Others/TreeMenu.vue +++ b/resources/js/components/Others/TreeMenu.vue @@ -25,7 +25,7 @@ - + + + + + @@ -82,6 +86,8 @@ import { UsersIcon, } from 'vue-feather-icons' import { mapGetters } from 'vuex' +import CreateUploadRequestPopup from "../components/Others/CreateUploadRequestPopup"; +import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup"; export default { name: 'Admin', @@ -186,6 +192,8 @@ export default { }, }, components: { + CreateTeamFolderPopup, + CreateUploadRequestPopup, MobileNavigationToolbar, FilePreview, Spotlight, diff --git a/resources/js/views/FileView/UploadRequestFiles.vue b/resources/js/views/FileView/UploadRequestFiles.vue index 7e812400..cd8dba04 100644 --- a/resources/js/views/FileView/UploadRequestFiles.vue +++ b/resources/js/views/FileView/UploadRequestFiles.vue @@ -142,7 +142,7 @@ {{ emptyPageDescription }}

- + {{ $t('{name} leave you a message', {name: userName}) }}:

{{ uploadRequest.data.attributes.notes }}

diff --git a/resources/js/views/Profile.vue b/resources/js/views/Profile.vue index cc0f0061..61cf4bbc 100644 --- a/resources/js/views/Profile.vue +++ b/resources/js/views/Profile.vue @@ -4,6 +4,10 @@ + + + + @@ -87,10 +91,14 @@ import { mapGetters } from 'vuex' import CardNavigation from '../components/Admin/CardNavigation' import ConfirmPassword from '../components/Others/ConfirmPassword' import MobileNavigationToolbar from '../components/Mobile/MobileNavigationToolbar' +import CreateUploadRequestPopup from "../components/Others/CreateUploadRequestPopup"; +import CreateTeamFolderPopup from "../components/Teams/CreateTeamFolderPopup"; export default { name: 'Settings', components: { + CreateTeamFolderPopup, + CreateUploadRequestPopup, MobileNavigationToolbar, MobileNavigation, ConfirmPassword, diff --git a/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php b/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php index 853735b6..034593c4 100644 --- a/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php +++ b/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php @@ -1,4 +1,5 @@ $request->input('folder_id'), 'email' => $request->input('email'), 'notes' => $request->input('notes'), + 'name' => $request->input('name'), ]); // If user type email, notify by email diff --git a/src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php b/src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php index 89e03855..21b133be 100644 --- a/src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php +++ b/src/Domain/UploadRequest/Controllers/UploadFilesForUploadRequestController.php @@ -65,9 +65,9 @@ class UploadFilesForUploadRequestController // Create folder DB::table('folders')->insert([ 'id' => $uploadRequest->id, - 'parent_id' => $uploadRequest->folder_id, + 'parent_id' => $uploadRequest->folder_id ?? null, 'user_id' => $uploadRequest->user_id, - 'name' => "Upload Request from $timestampName", + 'name' => $uploadRequest->name ?? "Upload Request from $timestampName", ]); // Update upload request status diff --git a/src/Domain/UploadRequest/Requests/StoreUploadRequest.php b/src/Domain/UploadRequest/Requests/StoreUploadRequest.php index 8509d482..c7624be3 100644 --- a/src/Domain/UploadRequest/Requests/StoreUploadRequest.php +++ b/src/Domain/UploadRequest/Requests/StoreUploadRequest.php @@ -1,4 +1,5 @@ 'sometimes|string', - 'notes' => 'sometimes|string', - 'folder_id' => 'required|string', + 'email' => 'sometimes|string|nullable', + 'notes' => 'sometimes|string|nullable', + 'folder_id' => 'sometimes|string', + 'name' => 'sometimes|string|nullable', ]; } } diff --git a/tests/Domain/UploadRequest/UploadRequestTest.php b/tests/Domain/UploadRequest/UploadRequestTest.php index ca8e3c27..fd3037d0 100644 --- a/tests/Domain/UploadRequest/UploadRequestTest.php +++ b/tests/Domain/UploadRequest/UploadRequestTest.php @@ -1,4 +1,5 @@ hasSettings() + ->create(); + + $this + ->actingAs($user) + ->postJson('/api/upload-request', [ + 'folder_id' => '00cacdb9-1d09-4a32-8ad7-c0d45d66b758', + 'notes' => 'Please send me your files...', + 'name' => 'My name', + ]) + ->assertCreated(); + + $this->assertDatabasehas('upload_requests', [ + 'folder_id' => '00cacdb9-1d09-4a32-8ad7-c0d45d66b758', + 'notes' => 'Please send me your files...', + 'email' => null, + 'name' => 'My name', + ]); + + Notification::assertNothingSent(); + } + /** * @test */ @@ -103,7 +132,7 @@ class UploadRequestTest extends TestCase /** * @test */ - public function it_upload_file_and_create_upload_request_folder() + public function it_upload_file_and_create_upload_request_folder_without_custom_folder_name() { $user = User::factory() ->hasSettings() @@ -114,6 +143,7 @@ class UploadRequestTest extends TestCase 'status' => 'active', 'user_id' => $user->id, 'created_at' => now(), + 'name' => null, ]); $file = UploadedFile::fake() @@ -144,6 +174,51 @@ class UploadRequestTest extends TestCase Storage::assertExists("files/$user->id/$file->basename"); } + /** + * @test + */ + public function it_upload_file_and_create_upload_request_folder_with_custom_folder_name() + { + $user = User::factory() + ->hasSettings() + ->create(); + + $uploadRequest = UploadRequest::factory() + ->create([ + 'status' => 'active', + 'user_id' => $user->id, + 'created_at' => now(), + 'name' => 'My Documents', + ]); + + $file = UploadedFile::fake() + ->create('fake-file.pdf', 12000000, 'application/pdf'); + + $this + ->postJson("/api/upload-request/$uploadRequest->id/upload", [ + 'filename' => $file->name, + 'file' => $file, + 'parent_id' => null, + 'path' => "/$file->name", + 'is_last' => 'true', + ])->assertStatus(201); + + $this + ->assertDatabaseHas('upload_requests', [ + 'status' => 'filling', + ]) + ->assertDatabaseHas('folders', [ + 'id' => $uploadRequest->id, + 'name' => 'My Documents', + ])->assertDatabaseHas('files', [ + 'parent_id' => $uploadRequest->id, + ]); + + $file = File::first(); + + Storage::assertExists("files/$user->id/$file->basename"); + } + /** * @test */