Skip to content

Commit 9ba27f2

Browse files
committed
✨ add upload files from modal
1 parent c465f4d commit 9ba27f2

14 files changed

+413
-7
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export const MAX_FILE_SIZE = 2000000;
2+
export const ALLOWED_FILE_TYPES = [
3+
'image/png',
4+
'image/jpeg',
5+
'image/jpg',
6+
'image/gif',
7+
'application/pdf'
8+
];

src/app/core/interfaces/response.interface.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { File } from "@models/file.model";
12
import { Folder } from "@models/folder.model";
23
import { User } from "@models/user.model";
34

@@ -20,3 +21,9 @@ export interface IFolderResponse {
2021
ok: boolean,
2122
folder: Folder,
2223
}
24+
25+
export interface IFileResponse {
26+
ok: boolean,
27+
msg: string,
28+
files: File[]
29+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { TestBed } from '@angular/core/testing';
2+
3+
import { FileService } from './file.service';
4+
5+
describe('FileService', () => {
6+
let service: FileService;
7+
8+
beforeEach(() => {
9+
TestBed.configureTestingModule({});
10+
service = TestBed.inject(FileService);
11+
});
12+
13+
it('should be created', () => {
14+
expect(service).toBeTruthy();
15+
});
16+
});

src/app/core/services/file.service.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { HttpClient } from '@angular/common/http';
2+
import { EventEmitter, Injectable } from '@angular/core';
3+
import { environment } from 'environments/environment';
4+
5+
import { Observable, map } from 'rxjs';
6+
7+
import { File as FileModel } from '@models/file.model';
8+
9+
import { IFileResponse } from '@interfaces/response.interface';
10+
11+
import Storage from '@utils/storage.util';
12+
13+
const base_url = environment.base_url;
14+
15+
@Injectable({
16+
providedIn: 'root'
17+
})
18+
export class FileService {
19+
filesCreated: EventEmitter<FileModel[]> = new EventEmitter();
20+
21+
get headers() {
22+
return {
23+
headers: {
24+
'x-token': Storage.getLocalStorage('token') || ''
25+
}
26+
};
27+
}
28+
29+
constructor(
30+
private http: HttpClient,
31+
) { }
32+
33+
createFiles(files: File[], folderID: string): Observable<boolean> {
34+
const url = `${base_url}/file/upload/${folderID}`;
35+
const formData = new FormData();
36+
files.forEach((file) => formData.append('file', file));
37+
return this.http.post<IFileResponse>(url, formData, this.headers).pipe(map(resp => {
38+
this.filesCreated.emit(resp.files);
39+
return resp.ok;
40+
}));
41+
}
42+
}

src/app/core/services/modal.service.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import { EventEmitter, Injectable } from '@angular/core';
55
})
66
export class ModalService {
77
openNewFolderModal: EventEmitter<{ open: boolean, folderID: string }> = new EventEmitter();
8+
openNewFileModal: EventEmitter<{ open: boolean, folderID: string }> = new EventEmitter();
89

910
openNewFolder(folderID: string): void {
1011
this.openNewFolderModal.emit({ open: true, folderID });
1112
}
13+
14+
openNewFile(folderID: string): void {
15+
this.openNewFileModal.emit({ open: true, folderID });
16+
}
1217
}

src/app/features/home/home.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@
2525
</div>
2626

2727
<app-new-folder></app-new-folder>
28+
<app-upload-files></app-upload-files>
Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { Component, OnInit } from '@angular/core';
1+
import { Component, OnDestroy, OnInit } from '@angular/core';
22

33
import { Subscription } from 'rxjs';
44

55
import { AuthService } from '@services/auth.service';
6+
import { FileService } from '@services/file.service';
67
import { FolderService } from '@services/folder.service';
78

89
import { Folder } from '@models/folder.model';
@@ -12,23 +13,38 @@ import { Folder } from '@models/folder.model';
1213
templateUrl: './home.component.html',
1314
styleUrls: ['./home.component.scss']
1415
})
15-
export class HomeComponent implements OnInit {
16+
export class HomeComponent implements OnInit, OnDestroy {
1617
root: Folder;
1718
folderCreatedSubscription: Subscription;
19+
filesCreatedSubscription: Subscription;
1820
constructor(
1921
private authService: AuthService,
20-
private folderService: FolderService
22+
private folderService: FolderService,
23+
private fileService: FileService,
2124
) { }
2225

26+
ngOnDestroy(): void {
27+
this.folderCreatedSubscription.unsubscribe();
28+
this.filesCreatedSubscription.unsubscribe();
29+
}
30+
2331
ngOnInit(): void {
2432
this.root = this.authService.userActive.rootFolder;
2533
this.folderCreatedSubscription = this.folderService.folderCreated.subscribe((folder) => {
2634
this.root.folders.push(folder);
2735
this.orderFolders();
2836
});
37+
this.filesCreatedSubscription = this.fileService.filesCreated.subscribe((files) => {
38+
this.root.files.push(...files);
39+
this.orderFiles();
40+
});
2941
}
3042

3143
private orderFolders(): void {
32-
this.root.folders.sort((a, b) => a.name > b.name ? 1 : -1);
44+
this.root.folders.sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1);
45+
}
46+
47+
private orderFiles(): void {
48+
this.root.files.sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1);
3349
}
3450
}

src/app/shared/headers/actions/actions.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<i class="bx bx-folder-plus"></i>
1010
<span class="title">Carpeta nueva</span>
1111
</li>
12-
<li class="item">
12+
<li class="item" (click)="openNewFileModal(btnDrop)">
1313
<i class="bx bx-upload"></i>
1414
<span class="title">Subir archivo</span>
1515
</li>

src/app/shared/headers/actions/actions.component.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,9 @@ export class ActionsComponent {
2828
this.closeDrop(element);
2929
this.modalService.openNewFolder(this.folder._id as string);
3030
}
31+
32+
openNewFileModal(element: HTMLButtonElement): void {
33+
this.closeDrop(element);
34+
this.modalService.openNewFile(this.folder._id as string);
35+
}
3136
}

src/app/shared/modals/modals.module.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@ import { NgModule } from '@angular/core';
33
import { FormsModule } from '@angular/forms';
44

55
import { NewFolderComponent } from './new-folder/new-folder.component';
6+
import { UploadFilesComponent } from './upload-files/upload-files.component';
67

78
@NgModule({
89
declarations: [
9-
NewFolderComponent
10+
NewFolderComponent,
11+
UploadFilesComponent
1012
],
1113
imports: [
1214
CommonModule,
1315
FormsModule,
1416
],
1517
exports: [
16-
NewFolderComponent
18+
NewFolderComponent,
19+
UploadFilesComponent
1720
]
1821
})
1922
export class ModalsModule { }

0 commit comments

Comments
 (0)