Skip to content

Commit 1b73d0c

Browse files
committed
✨ add get specific folder
1 parent db08eec commit 1b73d0c

16 files changed

+131
-72
lines changed

src/app/core/constants/file.constant.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const ICONS = {
1212
jpg: 'bxs-file-jpg',
1313
jpeg: 'bxs-file-image',
1414
pdf: 'bxs-file-pdf',
15+
docx: 'bxs-file',
1516
} as const;
1617

1718
export const ALLOWED_FILE_EXTENSIONS = [

src/app/core/models/file.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ export class File {
1212
createdAt: Date;
1313
updatedAt: Date;
1414
folder: Folder;
15+
type: string;
1516
_id?: string;
1617
}

src/app/core/models/folder.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export class Folder {
1111
createdAt: Date;
1212
updatedAt: Date;
1313
parent: Folder;
14+
type: string;
1415
folders: Folder[];
1516
files: File[];
1617
color: string;

src/app/features/folder/components/components.module.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import { CommonModule } from '@angular/common';
22
import { NgModule } from '@angular/core';
33

4+
import { PipesModule } from '@pipes/pipes.module';
5+
46
import { TableFilesComponent } from './table-files/table-files.component';
57

68
@NgModule({
79
declarations: [
810
TableFilesComponent
911
],
1012
imports: [
11-
CommonModule
13+
CommonModule,
14+
PipesModule
1215
],
1316
exports: [
1417
TableFilesComponent,

src/app/features/folder/components/table-files/table-files.component.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
<div class="items">
22
<div class="item">
33
<div class="icon">
4-
<i class="bx bx-file"></i>
4+
<i class="bx" [ngClass]="getIcon"></i>
55
</div>
66
<div class="name">
7-
<span>Ejemplo de dock</span>
7+
<span>{{ file.name }}</span>
88
</div>
99
<div class="type">
10-
<span>mp4</span>
10+
<span>{{ getExtension() }}</span>
1111
</div>
1212
<div class="size">
13-
<span>7 mb</span>
13+
<span>{{ file.size | fileSize }}</span>
1414
</div>
1515
<div class="actions">
1616
...
Lines changed: 39 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,52 @@
11
@import 'settings/_colors.scss';
22
@import 'settings/_typography.scss';
33

4-
.items {
4+
.item {
55
display: flex;
6-
flex-direction: column;
6+
flex-direction: row;
7+
align-items: center;
8+
height: 3.2rem;
9+
padding: 0 0.5rem;
10+
gap: 1rem;
11+
border-radius: 1rem;
12+
transition: 0.3s ease;
13+
cursor: pointer;
14+
15+
&:hover {
16+
background: var(--bg-hover-2);
17+
}
718

8-
& .item {
19+
& .icon {
20+
@include fs-2;
21+
width: 2.5rem;
22+
height: 2.5rem;
23+
border-radius: 50%;
924
display: flex;
10-
flex-direction: row;
1125
align-items: center;
12-
height: 3.2rem;
13-
padding: 0 0.5rem;
14-
gap: 1rem;
15-
border-radius: 1rem;
16-
transition: 0.3s ease;
17-
cursor: pointer;
18-
19-
&:hover {
20-
background: var(--bg-hover-2);
21-
}
22-
23-
& .icon {
24-
@include fs-3;
25-
width: 2.5rem;
26-
height: 2.5rem;
27-
border-radius: 50%;
28-
background: var(--bg-2);
29-
display: flex;
30-
align-items: center;
31-
justify-content: center;
32-
}
26+
justify-content: center;
27+
}
3328

34-
& .name, & .type, & .size {
35-
overflow: hidden;
36-
text-overflow: ellipsis;
37-
white-space: nowrap;
38-
}
29+
& .name, & .type, & .size {
30+
overflow: hidden;
31+
text-overflow: ellipsis;
32+
white-space: nowrap;
33+
}
3934

40-
& .name {
41-
@include fs-5;
42-
@include fw-400;
43-
flex: 2;
44-
color: var(--fc-primary);
45-
}
35+
& .name {
36+
@include fs-5;
37+
@include fw-400;
38+
flex: 2;
39+
color: var(--fc-primary);
40+
}
4641

47-
& .type, & .size {
48-
@include fs-6;
49-
flex: 1;
50-
color: var(--fc-secondary);
51-
text-align: center;
52-
}
42+
& .type, & .size {
43+
@include fs-6;
44+
flex: 1;
45+
color: var(--fc-secondary);
46+
}
5347

54-
& .actions {
55-
flex: 1;
56-
text-align: center;
57-
}
48+
& .actions {
49+
flex: 1;
50+
text-align: center;
5851
}
5952
}
Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
1-
import { Component } from '@angular/core';
1+
import { Component, Input } from '@angular/core';
2+
3+
import { File } from '@models/file.model';
4+
import { Folder } from '@models/folder.model';
5+
6+
import { ICONS } from '@constants/file.constant';
27

38
@Component({
49
selector: 'app-table-files',
510
templateUrl: './table-files.component.html',
611
styleUrls: ['./table-files.component.scss']
712
})
8-
export class TableFilesComponent {}
13+
export class TableFilesComponent {
14+
@Input() file: File | Folder;
15+
16+
get getIcon(): string {
17+
if (this.file.type === 'folder') return 'bxs-folder';
18+
const extension = this.file.name.split('.').pop();
19+
return ICONS[extension as keyof typeof ICONS] || 'bx-file';
20+
}
21+
22+
getExtension(): string {
23+
if (this.file.type === 'folder') return 'folder';
24+
return this.file.name.split('.').pop() as string;
25+
}
26+
}
Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1-
<div class="fluid-container">
1+
<div class="fluid-container" *ngIf="!loading">
22
<app-actions [folder]="folder"></app-actions>
3-
<div class="files">
3+
<div class="not-items" *ngIf="!allFiles.length && !allFiles.length">
4+
<img src="assets/images/no-files.svg" alt="no-files-image">
5+
<span class="description">Agrega tu primer archivo o carpeta</span>
6+
</div>
7+
<div class="files" *ngIf="allFiles.length && allFiles.length">
48
<section class="group">
59
<span class="title">Files</span>
6-
<app-table-files></app-table-files>
10+
<div class="items">
11+
<app-table-files *ngFor="let file of allFiles"
12+
[file]="file"
13+
></app-table-files>
14+
</div>
715
</section>
816
</div>
917
</div>
1018

1119
<app-new-folder></app-new-folder>
20+
<app-upload-files></app-upload-files>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
.items {
3+
display: flex;
4+
flex-direction: column;
5+
}
Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { Component, OnInit } from '@angular/core';
1+
import { Component, OnDestroy, OnInit } from '@angular/core';
22
import { ActivatedRoute, Router } from '@angular/router';
33

44
import { Subscription } from 'rxjs';
55

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

9+
import { File } from '@models/file.model';
810
import { Folder } from '@models/folder.model';
911

1012
import { isMongoId } from '@utils/mongo.util';
@@ -13,19 +15,34 @@ import { isMongoId } from '@utils/mongo.util';
1315
templateUrl: './folder.component.html',
1416
styleUrls: ['./folder.component.scss']
1517
})
16-
export class FolderComponent implements OnInit {
18+
export class FolderComponent implements OnInit, OnDestroy {
1719
folder: Folder;
1820
folderCreatedSubscripion: Subscription;
21+
filesUploadedSubscription: Subscription;
22+
loading = false;
23+
allFiles: (Folder | File)[];
24+
1925
constructor(
2026
private activatedRoute: ActivatedRoute,
2127
private router: Router,
22-
private folderService: FolderService
28+
private folderService: FolderService,
29+
private fileService: FileService,
2330
) { }
2431

32+
ngOnDestroy(): void {
33+
this.folderCreatedSubscripion.unsubscribe();
34+
this.filesUploadedSubscription.unsubscribe();
35+
}
36+
2537
ngOnInit(): void {
2638
this.folderCreatedSubscripion = this.folderService.folderCreated.subscribe((folder) => {
2739
this.folder.folders.push(folder);
2840
this.orderFolders();
41+
this.mixFilesAndFolders();
42+
});
43+
this.filesUploadedSubscription = this.fileService.filesCreated.subscribe((files: File[]) => {
44+
this.folder.files.push(...files);
45+
this.mixFilesAndFolders();
2946
});
3047
this.activatedRoute.params.subscribe(({folderId}) => {
3148
if(!isMongoId(folderId)) return this.router.navigate(['/']);
@@ -34,15 +51,23 @@ export class FolderComponent implements OnInit {
3451
}
3552

3653
getFolder(id: string): void {
54+
this.loading = true;
3755
this.folderService.getFolder(id).subscribe({
3856
next: (folder) => {
3957
this.folder = folder;
40-
}
58+
this.mixFilesAndFolders();
59+
},
60+
complete: () => this.loading = false
4161
});
4262
}
4363

4464
private orderFolders(): void {
4565
this.folder.folders.sort((a, b) => a.name > b.name ? 1 : -1);
4666
}
4767

68+
mixFilesAndFolders(): void {
69+
const { folders, files } = this.folder;
70+
this.allFiles = [...folders, ...files];
71+
}
72+
4873
}

0 commit comments

Comments
 (0)