Skip to content

Create the File Explorer ComponentΒ #285

@sujitkumardebnath2025-cloud

Description

import React, { useState } from 'react';
import '../../styles/FileExplorer.css';

interface FileItem {
id: number;
name: string;
dateModified: string;
type: string;
size: string;
isFolder: boolean;
icon: string;
}

const FileExplorer: React.FC = () => {
const [selectedItems, setSelectedItems] = useState<number[]>([]);
const [searchTerm, setSearchTerm] = useState('');
const [currentTab, setCurrentTab] = useState('Home');

// File and folder data
const fileItems: FileItem[] = [
{ id: 1, name: 'github', dateModified: '04-12-2025 10:38 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 2, name: 'bin', dateModified: '14-12-2025 10:38 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 3, name: 'Data', dateModified: '14-12-2025 10:38 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 4, name: 'docker', dateModified: '14-12-2025 10:38 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 5, name: 'Forms', dateModified: '14-12-2025 10:46 AM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 6, name: 'Models', dateModified: '14-12-2025 10:15 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 7, name: 'obj', dateModified: '21-01-2026 11:08 AM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 8, name: 'Resources', dateModified: '14-12-2025 10:04 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 9, name: 'scripts', dateModified: '14-12-2025 10:13 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 10, name: 'Services', dateModified: '14-12-2025 11:11 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 11, name: 'Setup', dateModified: '13-12-2025 10:16 PM', type: 'File folder', size: '', isFolder: true, icon: 'πŸ“' },
{ id: 12, name: '.gitignore', dateModified: '05-12-2025 11:06 PM', type: 'Git Ignore Source', size: '1 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 13, name: 'ACCOUNTING_MODULE', dateModified: '05-12-2025 10:22 PM', type: 'Markdown Source', size: '9 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 14, name: 'AccountingSchema', dateModified: '05-12-2025 10:22 PM', type: 'SQL Source File', size: '5 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 15, name: 'AccountingSoftwareAI.bat', dateModified: '14-12-2025 10:53 AM', type: 'Windows Batch File', size: '1 KB', isFolder: false, icon: 'βš™οΈ' },
{ id: 16, name: 'AccountingSoftwareAI.ps1', dateModified: '14-12-2025 10:59 PM', type: 'Windows PowerShell', size: '1 KB', isFolder: false, icon: 'βš™οΈ' },
{ id: 17, name: 'AccountingSoftwareAI.sln', dateModified: '14-12-2025 10:51 PM', type: 'Microsoft Visual Studio Solution', size: '2 KB', isFolder: false, icon: 'πŸ’»' },
{ id: 18, name: 'AuditLogSchema', dateModified: '05-12-2025 10:22 PM', type: 'SQL Source File', size: '1 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 19, name: 'Constants.cs', dateModified: '14-12-2025 10:53 AM', type: 'C# Source File', size: '2 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 20, name: 'DELIVERABLES_SUMMARY', dateModified: '05-12-2025 10:22 PM', type: 'Markdown Source', size: '13 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 21, name: 'DEPLOYMENT', dateModified: '05-12-2025 10:22 PM', type: 'Markdown Source', size: '9 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 22, name: 'FILE_INVENTORY', dateModified: '05-12-2025 10:22 PM', type: 'Markdown Source', size: '9 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 23, name: 'GST_COMPLIANCE', dateModified: '05-12-2025 10:22 PM', type: 'Markdown Source', size: '9 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 24, name: 'INSTALLER_TROUBLESHOOTING', dateModified: '05-12-2025 10:22 PM', type: 'Markdown Source', size: '9 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 25, name: 'INTERACTION_CHECKLIST', dateModified: '05-12-2025 10:22 PM', type: 'Markdown Source', size: '9 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 26, name: 'LICENSE', dateModified: '04-12-2025 11:56 AM', type: 'File', size: '2 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 27, name: 'OFFLINE_INSTALLER_GUIDE', dateModified: '14-12-2025 10:53 AM', type: 'Markdown Source', size: '11 KB', isFolder: false, icon: 'πŸ“„' },
{ id: 28, name: 'OFFLINE_SETUP_SUMMARY', dateModified: '12-12-2025 10:06 PM', type: 'Markdown Source', size: '9 KB', isFolder: false, icon: 'πŸ“„' },
];

const quickAccessItems = [
{ name: 'Desktop', icon: 'πŸ–₯️' },
{ name: 'Downloads', icon: 'πŸ“₯' },
{ name: 'Documents', icon: 'πŸ“' },
{ name: 'Pictures', icon: 'πŸ–ΌοΈ' },
{ name: 'Videos', icon: '🎬' },
{ name: 'OneDrive', icon: '☁️' },
];

const thisPCItems = [
{ name: 'This PC', icon: 'πŸ’»' },
{ name: '3D Objects', icon: '🎨' },
{ name: 'Desktop', icon: 'πŸ–₯️' },
{ name: 'Documents', icon: 'πŸ“' },
{ name: 'Downloads', icon: 'πŸ“₯' },
{ name: 'Music', icon: '🎡' },
{ name: 'Pictures', icon: 'πŸ–ΌοΈ' },
{ name: 'Videos', icon: '🎬' },
{ name: 'Local Disk (C:)', icon: 'πŸ’Ώ' },
{ name: 'New Volume (E:)', icon: 'πŸ’Ώ' },
{ name: 'New Volume (F:)', icon: 'πŸ’Ώ' },
{ name: 'Local Disk (G:)', icon: 'πŸ’Ώ' },
{ name: 'New Volume (H:)', icon: 'πŸ’Ώ' },
{ name: 'Network', icon: '🌐' },
];

const tabs = ['File', 'Home', 'Share', 'View'];

const filteredItems = fileItems.filter(item =>
item.name.toLowerCase().includes(searchTerm.toLowerCase())
);

const handleSelectItem = (id: number) => {
setSelectedItems(prev => {
if (prev.includes(id)) {
return prev.filter(itemId => itemId !== id);
} else {
return [...prev, id];
}
});
};

const handleSelectAll = () => {
if (selectedItems.length === filteredItems.length) {
setSelectedItems([]);
} else {
setSelectedItems(filteredItems.map(item => item.id));
}
};

const handleCut = () => {
console.log('Cut items:', selectedItems);
alert(Cut ${selectedItems.length} item(s));
};

const handleCopy = () => {
console.log('Copy items:', selectedItems);
alert(Copied ${selectedItems.length} item(s));
};

const handlePaste = () => {
console.log('Paste items');
alert('Pasted items');
};

const handleDelete = () => {
if (selectedItems.length > 0 && window.confirm(Delete ${selectedItems.length} selected item(s)?)) {
console.log('Delete items:', selectedItems);
alert(Deleted ${selectedItems.length} item(s));
}
};

const handleRename = () => {
if (selectedItems.length === 1) {
const item = fileItems.find(f => f.id === selectedItems[0]);
const newName = prompt('Enter new name:', item?.name);
if (newName) {
console.log(Renamed ${item?.name} to ${newName});
alert(Renamed to ${newName});
}
} else {
alert('Please select exactly one item to rename');
}
};

const handleNewFolder = () => {
const folderName = prompt('Enter folder name:', 'New Folder');
if (folderName) {
console.log(Created new folder: ${folderName});
alert(Created folder: ${folderName});
}
};

const handleOpen = () => {
if (selectedItems.length === 1) {
const item = fileItems.find(f => f.id === selectedItems[0]);
if (item?.isFolder) {
console.log(Opening folder: ${item.name});
alert(Opening folder: ${item.name});
} else {
console.log(Opening file: ${item?.name});
alert(Opening file: ${item?.name});
}
}
};

const getFileIcon = (type: string) => {
if (type.includes('folder')) return 'πŸ“';
if (type.includes('C#')) return 'πŸ’»';
if (type.includes('Batch')) return 'βš™οΈ';
if (type.includes('PowerShell')) return 'βš™οΈ';
if (type.includes('Solution')) return 'πŸ’»';
if (type.includes('Markdown')) return 'πŸ“„';
if (type.includes('SQL')) return 'πŸ—„οΈ';
return 'πŸ“„';
};

return (


{/* Header Tabs */}


{tabs.map(tab => (
<button
key={tab}
className={tab ${currentTab === tab ? 'active' : ''}}
onClick={() => setCurrentTab(tab)}
>
{tab}

))}

    <div className="tab-actions">
      <button className="tab-action" onClick={handleCut}>Cut</button>
      <button className="tab-action" onClick={handleCopy}>Copy path</button>
      <button className="tab-action" onClick={handlePaste}>Paste</button>
      <button className="tab-action" onClick={handlePaste}>Paste shortcut</button>
      <button className="tab-action" onClick={handleCut}>Move</button>
      <button className="tab-action" onClick={handleCopy}>Copy</button>
      <button className="tab-action" onClick={handleDelete}>Delete</button>
      <button className="tab-action" onClick={handleRename}>Rename</button>
      <button className="tab-action" onClick={handleNewFolder}>New folder</button>
      <button className="tab-action" onClick={handleOpen}>Open</button>
      <button className="tab-action" onClick={handleSelectAll}>Select all</button>
      <button className="tab-action" onClick={() => setSelectedItems([])}>Select none</button>
      <button className="tab-action">History</button>
      <button className="tab-action">Import selection</button>
      <button className="tab-action">Export selection</button>
      <button className="tab-action">Insert selection</button>
      <button className="tab-action">Close</button>
    </div>
  </div>

  <div className="explorer-content">
    {/* Sidebar */}
    <div className="sidebar">
      <div className="sidebar-section">
        <h3 className="sidebar-title">Quick access</h3>
        <ul className="sidebar-list">
          {quickAccessItems.map(item => (
            <li key={item.name} className="sidebar-item">
              <span className="item-icon">{item.icon}</span>
              <span className="item-name">{item.name}</span>
            </li>
          ))}
        </ul>
      </div>

      <div className="sidebar-section">
        <h3 className="sidebar-title">This PC</h3>
        <ul className="sidebar-list">
          {thisPCItems.map(item => (
            <li key={item.name} className="sidebar-item">
              <span className="item-icon">{item.icon}</span>
              <span className="item-name">{item.name}</span>
            </li>
          ))}
        </ul>
      </div>
    </div>

    {/* Main Content */}
    <div className="main-content">
      {/* Search Bar */}
      <div className="search-container">
        <div className="search-bar">
          <span className="search-icon">πŸ”</span>
          <input
            type="text"
            className="search-input"
            placeholder="Search AccountingSoftwareAI"
            value={searchTerm}
            onChange={(e) => setSearchTerm(e.target.value)}
          />
        </div>
      </div>

      {/* Files Table */}
      <div className="files-table-container">
        <table className="files-table">
          <thead>
            <tr>
              <th style={{ width: '40%' }}>
                <input
                  type="checkbox"
                  checked={selectedItems.length === filteredItems.length && filteredItems.length > 0}
                  onChange={handleSelectAll}
                  className="select-checkbox"
                />
                Name
              </th>
              <th style={{ width: '25%' }}>Date modified</th>
              <th style={{ width: '25%' }}>Type</th>
              <th style={{ width: '10%' }}>Size</th>
            </tr>
          </thead>
          <tbody>
            {filteredItems.map(item => (
              <tr
                key={item.id}
                className={`file-row ${selectedItems.includes(item.id) ? 'selected' : ''}`}
                onClick={() => handleSelectItem(item.id)}
                onDoubleClick={() => item.isFolder && handleOpen()}
              >
                <td className="file-name-cell">
                  <input
                    type="checkbox"
                    checked={selectedItems.includes(item.id)}
                    onChange={() => {}}
                    className="row-checkbox"
                  />
                  <span className="file-icon">
                    {getFileIcon(item.type)}
                  </span>
                  <span className="file-name">{item.name}</span>
                </td>
                <td className="file-date">{item.dateModified}</td>
                <td className="file-type">{item.type}</td>
                <td className="file-size">{item.size}</td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>

      {/* Footer */}
      <div className="explorer-footer">
        <div className="footer-info">
          <span>{filteredItems.length} items</span>
          <span>β€’</span>
          <span>{selectedItems.length} item selected</span>
        </div>
        <div className="footer-actions">
          <button className="footer-btn">πŸ“</button>
          <button className="footer-btn">πŸ“Š</button>
          <button className="footer-btn">βš™οΈ</button>
        </div>
      </div>
    </div>
  </div>
</div>

);
};

export default FileExplorer;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions