Skip to content

Commit a1c4f34

Browse files
committed
✨ add update folder name
1 parent 448d5c5 commit a1c4f34

18 files changed

+220
-31
lines changed

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const base_url = environment.base_url;
1616
providedIn: 'root'
1717
})
1818
export class FolderService {
19-
folderCreated: EventEmitter<Folder> = new EventEmitter();
19+
folderCreated: EventEmitter<{folder: Folder, isNew: boolean}> = new EventEmitter();
2020
folderTemp: Folder;
2121

2222
get headers() {
@@ -35,7 +35,7 @@ export class FolderService {
3535
const url = `${base_url}/folder/${folderID}`;
3636
this.http.post<IFolderCreated>(url, { name: folderName }, this.headers).subscribe({
3737
next: ({ folder }) => {
38-
this.folderCreated.emit(folder);
38+
this.folderCreated.emit({ folder, isNew: true });
3939
}
4040
});
4141
}
@@ -50,4 +50,11 @@ export class FolderService {
5050
return true;
5151
}), catchError(() => of(false)));
5252
}
53+
54+
updateFolder(
55+
{ folderID, name, color }
56+
: { folderID: string, name?: string, color?: string }): Observable<IFolderCreated> {
57+
const url = `${base_url}/folder/update/${folderID}`;
58+
return this.http.patch<IFolderCreated>(url, { name, color }, this.headers);
59+
}
5360
}

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

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

1011
openNewFolder(folderID: string): void {
1112
this.openNewFolderModal.emit({ open: true, folderID });
@@ -14,4 +15,8 @@ export class ModalService {
1415
openNewFile(folderID: string): void {
1516
this.openNewFileModal.emit({ open: true, folderID });
1617
}
18+
19+
openUpdateName(folderID: string, name: string): void {
20+
this.openUpdateNameModal.emit({ folderID, name });
21+
}
1722
}

src/app/features/folder/folder.component.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ export class FolderComponent implements OnInit, OnDestroy {
3131
}
3232

3333
ngOnInit(): void {
34-
this.folderCreatedSubscripion = this.folderService.folderCreated.subscribe((folder) => {
35-
this.folder.folders.push(folder);
34+
this.folderCreatedSubscripion = this.folderService
35+
.folderCreated.subscribe(({ folder, isNew }) => {
36+
if (isNew) this.folder.folders.push(folder);
37+
else this.folder.folders = this.folder.folders.map((f) => f._id === folder._id ? folder : f);
3638
this.orderFolders();
3739
this.mixFilesAndFolders();
3840
});
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div class="folder" [routerLink]="['/folder', folder._id]">
2-
<div class="icon" [ngStyle]="{'color': (folder.color) ? folder.color : 'var(--fc-secondary)'}">
3-
<i class="bx bxs-folder"></i>
2+
<div class="icon" >
3+
<i class="bx bxs-folder" [ngStyle]="{'color': (folder.color) ? folder.color : '#ff8550'}"></i>
44
</div>
55
<span class="name">{{ folder.name }}</span>
66
</div>
7-
<app-dots-dropdown class="actions"></app-dots-dropdown>
7+
<app-dots-dropdown class="actions" [file]="folder"></app-dots-dropdown>

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44
<img src="assets/images/no-files.svg" alt="no-files-image">
55
<span class="description">Agrega tu primer archivo o carpeta</span>
66
</div>
7-
<div class="files" *ngIf="root.folders.length > 1 || root.files.length > 1">
7+
<div class="files" *ngIf="root.folders.length > 0 || root.files.length > 0">
88
<section class="group" *ngIf="root.folders.length > 0">
9-
<span class="title">Folders</span>
9+
<span class="title">Carpetas</span>
1010
<div class="items">
1111
<app-folder *ngFor="let folder of root.folders" class="item"
1212
[folder]="folder"
1313
></app-folder>
1414
</div>
1515
</section>
1616
<section class="group" *ngIf="root.files.length > 0">
17-
<span class="title">Files</span>
17+
<span class="title">Archivos</span>
1818
<div class="items">
1919
<app-file *ngFor="let file of root.files" class="item"
2020
[file]="file"
@@ -26,3 +26,4 @@
2626

2727
<app-new-folder></app-new-folder>
2828
<app-upload-files></app-upload-files>
29+
<app-update-name></app-update-name>

src/app/features/home/home.component.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ export class HomeComponent implements OnInit, OnDestroy {
3030

3131
ngOnInit(): void {
3232
this.root = this.authService.userActive.rootFolder;
33-
this.folderCreatedSubscription = this.folderService.folderCreated.subscribe((folder) => {
34-
this.root.folders.push(folder);
35-
this.orderFolders();
33+
this.folderCreatedSubscription = this.folderService
34+
.folderCreated.subscribe(({folder, isNew}) => {
35+
if (isNew) this.root.folders.push(folder);
36+
else this.root.folders = this.root.folders.map((f) => f._id === folder._id ? folder : f);
37+
this.orderFolders();
3638
});
3739
this.filesCreatedSubscription = this.fileService.filesCreated.subscribe((files) => {
3840
this.root.files.push(...files);

src/app/shared/dropdowns/dots-dropdown/dots-dropdown.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<button class="options" (click)="changeVisibility()">
22
<i class="bx bx-dots-vertical-rounded"></i>
33
</button>
4-
<ul class='dropdown-list' role="menu" #dropdown>
5-
<li role="menuitem" class='dropdown-item'>
4+
<ul class='dropdown-list' role="menu" #dropdown [id]="buildId()" *ngIf="file">
5+
<li role="menuitem" class='dropdown-item' (click)="openRenameModal()">
66
<i class="bx bx-edit-alt"></i>
77
<span class="title">Cambiar nombre</span>
88
</li>
9-
<li role="menuitem" class='dropdown-item'>
9+
<li role="menuitem" class='dropdown-item' *ngIf="!isFile()">
1010
<i class="bx bx-palette"></i>
1111
<span class="title">Cambiar color</span>
1212
</li>

src/app/shared/dropdowns/dots-dropdown/dots-dropdown.component.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
22

33
import { FileService } from '@services/file.service';
4+
import { ModalService } from '@services/modal.service';
45

56
import { File } from '@models/file.model';
67
import { Folder } from '@models/folder.model';
@@ -13,13 +14,21 @@ import { Folder } from '@models/folder.model';
1314
export class DotsDropdownComponent {
1415
@Input() file: File | Folder;
1516
@ViewChild('dropdown') dropdown: ElementRef;
16-
17+
@Input() id: string;
18+
dropdowns: HTMLUListElement[] = [];
1719
constructor(
1820
private fileService: FileService,
21+
private modalService: ModalService,
1922
) { }
2023

2124
changeVisibility() {
2225
this.dropdown.nativeElement.classList.toggle('show');
26+
this.dropdowns = Array.from(document.querySelectorAll('.dropdown-list'));
27+
this.dropdowns.forEach((dropdown) => {
28+
if(dropdown.id !== this.buildId()) {
29+
dropdown.classList.remove('show');
30+
}
31+
});
2332
}
2433

2534
downloadFile(): void {
@@ -37,7 +46,22 @@ export class DotsDropdownComponent {
3746
});
3847
}
3948

49+
buildId(): string {
50+
const length = this.file._id?.length as number;
51+
const id = this.file._id?.substring(length - 10);
52+
return id as string;
53+
}
54+
4055
hideDropdown(): void {
4156
this.dropdown.nativeElement.classList.remove('show');
4257
}
58+
59+
isFile(): boolean {
60+
return this.file.type === 'file';
61+
}
62+
63+
openRenameModal(): void {
64+
this.hideDropdown();
65+
this.modalService.openUpdateName(this.file._id as string, this.file.name);
66+
}
4367
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
display: block;
66
}
77

8+
.actions {
9+
display: flex;
10+
align-items: center;
11+
justify-content: flex-end;
12+
gap: 1rem;
13+
}
14+
815
.list-items {
916
position: absolute;
1017
margin-top: 5px;
@@ -14,6 +21,7 @@
1421
box-shadow: 0 3px 10px rgb(0 0 0 / 20%);
1522
z-index: 10;
1623
transition: 0.3s ease;
24+
right: 1rem;
1725
display: none;
1826

1927
.item {

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import { FormsModule } from '@angular/forms';
55
import { PipesModule } from '@pipes/pipes.module';
66

77
import { NewFolderComponent } from './new-folder/new-folder.component';
8+
import { UpdateNameComponent } from './update-name/update-name.component';
89
import { UploadFilesComponent } from './upload-files/upload-files.component';
910

1011
@NgModule({
1112
declarations: [
1213
NewFolderComponent,
13-
UploadFilesComponent
14+
UploadFilesComponent,
15+
UpdateNameComponent
1416
],
1517
imports: [
1618
CommonModule,
@@ -19,7 +21,8 @@ import { UploadFilesComponent } from './upload-files/upload-files.component';
1921
],
2022
exports: [
2123
NewFolderComponent,
22-
UploadFilesComponent
24+
UploadFilesComponent,
25+
UpdateNameComponent
2326
]
2427
})
2528
export class ModalsModule { }

0 commit comments

Comments
 (0)