231 lines
8.5 KiB
TypeScript
231 lines
8.5 KiB
TypeScript
import { Component, OnInit } from '@angular/core';
|
|
import { FoldersService } from 'src/app/services/rest/folders.service';
|
|
import { Document, Folders } from 'src/app/data/folders';
|
|
|
|
@Component({
|
|
selector: 'app-view-all-folder',
|
|
templateUrl: './viewall-forder.component.html',
|
|
styleUrls: ['./viewall-forder.component.scss']
|
|
})
|
|
export class ViewAllFolderComponent implements OnInit {
|
|
folders: Folders[] = [];
|
|
documents: Document[] = [];
|
|
|
|
constructor(private foldersService: FoldersService) {}
|
|
|
|
ngOnInit(): void {
|
|
this.foldersService.getFoldersAndDocuments().subscribe({
|
|
next: data => {
|
|
this.folders = data.folders;
|
|
this.documents = data.documents;
|
|
this.initializeFolders();
|
|
this.initializeDocuments();
|
|
this.addEventListeners();
|
|
},
|
|
error: error => {
|
|
console.error('Error fetching data:', error);
|
|
// Xử lý lỗi theo yêu cầu của bạn
|
|
}
|
|
});
|
|
}
|
|
|
|
initializeFolders(): void {
|
|
const foldersContainer = document.getElementById('folders-container');
|
|
if (foldersContainer) {
|
|
foldersContainer.innerHTML = '';
|
|
|
|
const createFolders = (parentId: number | null, parentDiv: HTMLElement | null) => {
|
|
this.folders.forEach(folder => {
|
|
if (folder.parent_folder_id === parentId) {
|
|
const folderHTML = this.createFolderHTML(folder, parentDiv);
|
|
createFolders(folder.id, folderHTML.querySelector('.children-container') as HTMLElement);
|
|
}
|
|
});
|
|
};
|
|
|
|
this.folders.forEach(folder => {
|
|
if (folder.parent_folder_id === null) {
|
|
const folderHTML = this.createFolderHTML(folder);
|
|
foldersContainer.appendChild(folderHTML);
|
|
this.documents.forEach(doc => {
|
|
if (doc.folder_id === folder.id) {
|
|
const documentHTML = this.createDocumentHTML(doc);
|
|
folderHTML.querySelector('.children-container')?.appendChild(documentHTML);
|
|
}
|
|
});
|
|
createFolders(folder.id, folderHTML.querySelector('.children-container') as HTMLElement);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
initializeDocuments(): void {
|
|
const documentsContainer = document.getElementById('documents-container');
|
|
const foldersContainer = document.getElementById('folders-container');
|
|
|
|
if (documentsContainer && foldersContainer) {
|
|
documentsContainer.innerHTML = '';
|
|
|
|
const addedDocumentFilenames = new Set<string>();
|
|
|
|
this.documents.forEach(doc => {
|
|
if (!addedDocumentFilenames.has(doc.filename)) {
|
|
const folder = this.findFolderById(doc.folder_id);
|
|
if (folder && folder.id === 71) {
|
|
const folderDiv = this.findFolderDiv(folder.id);
|
|
if (folderDiv) {
|
|
const documentsContainerInFolder = folderDiv.querySelector('.documents-container');
|
|
if (documentsContainerInFolder) {
|
|
if (!documentsContainerInFolder.querySelector(`.document[data-document-id="${doc.id}"]`)) {
|
|
const documentHTML = this.createDocumentHTML(doc);
|
|
documentsContainerInFolder.appendChild(documentHTML);
|
|
addedDocumentFilenames.add(doc.filename);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (!documentsContainer.querySelector(`.document[data-document-id="${doc.id}"]`)) {
|
|
const documentHTML = this.createDocumentHTML(doc);
|
|
documentsContainer.appendChild(documentHTML);
|
|
addedDocumentFilenames.add(doc.filename);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
createFolderHTML(folder: Folders, parentDiv: HTMLElement | null = null): HTMLElement {
|
|
const folderDiv = document.createElement('div');
|
|
folderDiv.classList.add('folder');
|
|
folderDiv.dataset.folderId = folder.id.toString();
|
|
|
|
if (this.hasParentFolder(folder.id)) {
|
|
const keDiv = document.createElement('div');
|
|
keDiv.classList.add('ke');
|
|
folderDiv.appendChild(keDiv);
|
|
}
|
|
|
|
if (parentDiv) {
|
|
parentDiv.appendChild(folderDiv);
|
|
folderDiv.style.marginLeft = '0px';
|
|
}
|
|
|
|
const folderIcon = document.createElement('i');
|
|
folderIcon.classList.add('fa', 'fa-solid', 'fa-chevron-right');
|
|
const folderIconFolder = document.createElement('i');
|
|
folderIconFolder.classList.add('fa', 'fa-solid', 'fa-folder');
|
|
|
|
const folderName = document.createElement('p');
|
|
folderName.textContent = folder.name;
|
|
|
|
const folderHeader = document.createElement('div');
|
|
folderHeader.classList.add('folder-cha');
|
|
folderHeader.appendChild(folderIcon);
|
|
folderHeader.appendChild(folderIconFolder);
|
|
folderHeader.appendChild(folderName);
|
|
|
|
folderDiv.appendChild(folderHeader);
|
|
|
|
const childrenContainer = document.createElement('div');
|
|
childrenContainer.classList.add('children-container');
|
|
childrenContainer.style.display = 'none';
|
|
folderDiv.appendChild(childrenContainer);
|
|
|
|
return folderDiv;
|
|
}
|
|
|
|
createDocumentHTML(doc: Document): HTMLElement {
|
|
const documentDiv = document.createElement('div');
|
|
documentDiv.classList.add('document');
|
|
documentDiv.dataset.documentId = doc.id.toString();
|
|
|
|
const documentName = document.createElement('p');
|
|
documentName.textContent = doc.filename;
|
|
|
|
const documentContainer = document.createElement('div');
|
|
documentContainer.classList.add('document-container');
|
|
documentContainer.appendChild(documentName);
|
|
|
|
documentDiv.appendChild(documentContainer);
|
|
return documentDiv;
|
|
}
|
|
|
|
hasParentFolder(folderId: number): boolean {
|
|
return this.folders.some(folder => folder.parent_folder_id === folderId);
|
|
}
|
|
|
|
findFolderById(folderId: number | null): Folders | undefined {
|
|
return this.folders.find(folder => folder.id === folderId);
|
|
}
|
|
|
|
findFolderDiv(folderId: number): HTMLElement | null {
|
|
const foldersContainer = document.getElementById('folders-container');
|
|
return foldersContainer?.querySelector(`.folder[data-folder-id="${folderId}"]`) as HTMLElement;
|
|
}
|
|
|
|
addEventListeners(): void {
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
const folderLeft = document.getElementById('folderLeft');
|
|
if (folderLeft) {
|
|
const resizeHandle = folderLeft.querySelector('.resize-handle') as HTMLElement | null;
|
|
if (resizeHandle) {
|
|
let startX: number, startWidth: number;
|
|
|
|
resizeHandle.addEventListener('mousedown', (event: MouseEvent) => {
|
|
startX = event.clientX;
|
|
startWidth = parseInt(document.defaultView.getComputedStyle(folderLeft).width, 10);
|
|
|
|
document.addEventListener('mousemove', resizeWidth);
|
|
document.addEventListener('mouseup', stopResize);
|
|
});
|
|
|
|
const resizeWidth = (event: MouseEvent) => {
|
|
const newWidth = startWidth + (event.clientX - startX);
|
|
folderLeft.style.width = newWidth + 'px';
|
|
const folderRight = document.querySelector('.folder-right') as HTMLElement | null;
|
|
if (folderRight) {
|
|
folderRight.style.width = `calc(100% - ${newWidth}px)`;
|
|
}
|
|
};
|
|
|
|
const stopResize = () => {
|
|
document.removeEventListener('mousemove', resizeWidth);
|
|
document.removeEventListener('mouseup', stopResize);
|
|
};
|
|
}
|
|
}
|
|
|
|
// Handle folder open/close toggle
|
|
const folderCha = document.querySelectorAll('.folder-cha');
|
|
if (folderCha.length > 0) {
|
|
folderCha.forEach(item => {
|
|
let isOpen = false; // Track whether folder is open or closed
|
|
const folderIcon = item.querySelector('.fa-folder');
|
|
const chevronIcon = item.querySelector('.fa-chevron-right') as HTMLElement;
|
|
const folder = item.closest('.folder');
|
|
const ke = folder.querySelector('.ke');
|
|
|
|
item.addEventListener('click', () => {
|
|
if (isOpen) {
|
|
const ke = folder.querySelector('.ke') as HTMLElement;
|
|
ke.style.display = 'none'; // Hide .ke when closing the folder
|
|
folderIcon.classList.remove('fa-folder-open' ) ;
|
|
folderIcon.classList.add('fa-folder');
|
|
chevronIcon.style.transform = ''; // Reset chevron rotation
|
|
} else {
|
|
const ke = folder.querySelector('.ke') as HTMLElement;
|
|
ke.style.display = 'block'; // Show .ke when opening the folder
|
|
folderIcon.classList.remove('fa-folder');
|
|
folderIcon.classList.add('fa-folder-open');
|
|
chevronIcon.style.transform = 'rotate(90deg)'; // Rotate chevron
|
|
}
|
|
|
|
isOpen = !isOpen; // Toggle isOpen state
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|