# File Browser Demo A comprehensive file browser component built with Yew (Rust) and compiled to WebAssembly, featuring Uppy.js integration for resumable file uploads via the TUS protocol. ## Features - 📁 **File System Browser**: Navigate directories, view files with metadata - ⬆️ **Resumable Uploads**: TUS protocol support via Uppy.js for reliable file uploads - ⬇️ **File Downloads**: Direct download with progress tracking - 🗂️ **Directory Management**: Create and delete directories - 🗑️ **File Management**: Delete files with confirmation - 📊 **Progress Tracking**: Real-time upload progress with visual indicators - 🎨 **Modern UI**: Bootstrap-styled responsive interface - 🚀 **WebAssembly**: High-performance Rust code compiled to WASM ## Architecture ### Component Structure ``` FileBrowser ├── FileBrowserConfig (Properties) ├── FileBrowserMsg (Messages) ├── API Functions (HTTP calls to backend) └── Uppy.js Integration (JavaScript interop) ``` ### Key Components 1. **FileBrowser**: Main Yew component with file listing, navigation, and upload UI 2. **FileBrowserConfig**: Configuration struct for customizing the widget 3. **API Layer**: Async functions for backend communication using web_sys::fetch 4. **Uppy Integration**: JavaScript interop for TUS resumable uploads ## Configuration Options The `FileBrowserConfig` struct allows extensive customization: ```rust FileBrowserConfig { base_endpoint: "/files".to_string(), // Backend API endpoint max_file_size: 100 * 1024 * 1024, // Max file size (100MB) chunk_size: 1024 * 1024, // Download chunk size (1MB) initial_path: "".to_string(), // Starting directory show_upload: true, // Enable upload functionality show_download: true, // Enable download functionality show_delete: true, // Enable delete functionality show_create_dir: true, // Enable directory creation css_classes: "container-fluid".to_string(), // Custom CSS classes theme: "light".to_string(), // Uppy theme (light/dark) } ``` ## Backend Compatibility The file browser component is designed to work with the Python Flask backend from `src/files.py`. It expects the following API endpoints: - `GET /files/list/{path}` - List directory contents - `POST /files/upload` - TUS resumable upload endpoint - `GET /files/download/{path}` - Download files - `POST /files/dirs/{path}` - Create directories - `DELETE /files/delete/{path}` - Delete files/directories ### Mock Server For testing and development, this demo includes a Rust-based mock server that implements the same API as the Python backend: **Location:** `mock-server/` **Features:** - Full API compatibility with `src/files.py` - Sample files and directories for testing - CORS enabled for frontend development - Lightweight and fast - No external dependencies beyond Rust **Manual Usage:** ```bash # Start just the mock server ./run-mock-server.sh # Or run manually cd mock-server cargo run --release ``` ## Quick Start ### Prerequisites - Rust (latest stable version) - `trunk` for building and serving WASM applications: ```bash cargo install trunk ``` - `wasm32-unknown-unknown` target: ```bash rustup target add wasm32-unknown-unknown ``` ### Easy Demo Launch The quickest way to see the file browser in action: ```bash ./run-demo.sh ``` This script will: 1. Build and start the Rust mock server on `http://localhost:3001` 2. Build and serve the WASM demo on `http://localhost:8080` 3. Automatically open your browser to the demo 4. Handle cleanup when you press Ctrl+C ## Prerequisites 1. **Rust and Trunk**: ```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh cargo install trunk ``` 2. **Backend Server**: The Python Flask backend from the knowledgecenter project ## Building and Running ### 1. Build the WASM Application ```bash # From the file_browser_demo directory ./build.sh ``` This will: - Build the Rust code to WebAssembly using Trunk - Generate optimized WASM and JavaScript files - Output files to the `dist/` directory ### 2. Start the Backend Server ```bash # From the knowledgecenter directory cd /path/to/knowledgecenter python -m flask run ``` Make sure CORS is configured to allow requests from your frontend origin. ### 3. Serve the Frontend **Development Mode:** ```bash # From the file_browser_demo directory trunk serve ``` **Production Mode:** ```bash # From the file_browser_demo directory ./serve.sh ``` ### 4. Open in Browser Trunk will automatically open `http://127.0.0.1:8080` in your web browser. ## Usage as a Widget The file browser can be used as a reusable widget in other Yew applications: ```rust use framework::components::{FileBrowser, FileBrowserConfig}; #[function_component(MyApp)] fn my_app() -> Html { let config = FileBrowserConfig { base_endpoint: "/api/files".to_string(), initial_path: "documents".to_string(), theme: "dark".to_string(), ..Default::default() }; html! {
} } ``` ## Customization ### Styling The component uses Bootstrap classes and can be customized via: 1. **CSS Classes**: Pass custom classes via `css_classes` in config 2. **Theme**: Set Uppy theme to "light" or "dark" 3. **Custom CSS**: Override the default styles in your application ### Functionality Enable/disable features via configuration: ```rust FileBrowserConfig { show_upload: false, // Hide upload functionality show_delete: false, // Hide delete buttons show_create_dir: false, // Hide directory creation // ... other options } ``` ## Development ### Project Structure ``` file_browser_demo/ ├── Cargo.toml # Rust dependencies ├── build.sh # Build script ├── index.html # HTML template with Uppy.js ├── src/ │ └── main.rs # Main Yew application └── README.md # This file ``` ### Key Dependencies - **yew**: Rust web framework - **wasm-bindgen**: Rust/JavaScript interop - **web-sys**: Web API bindings - **serde**: Serialization for API communication - **js-sys**: JavaScript value manipulation ### JavaScript Dependencies - **Uppy.js**: File upload library with TUS support - **Bootstrap**: UI framework - **Bootstrap Icons**: Icon set ## Troubleshooting ### WASM Module Loading Issues 1. Ensure files are served over HTTP (not file://) 2. Check browser console for detailed error messages 3. Verify WASM files are generated in `pkg/` directory ### Upload Issues 1. Check backend server is running and accessible 2. Verify CORS configuration allows your frontend origin 3. Ensure TUS endpoints are properly implemented in backend ### Build Issues 1. Update Rust toolchain: `rustup update` 2. Clear cargo cache: `cargo clean` 3. Reinstall wasm-pack if needed ## Browser Support - Chrome/Chromium 80+ - Firefox 72+ - Safari 13.1+ - Edge 80+ WebAssembly and modern JavaScript features are required. ## License This demo is part of the Hero Framework project. See the main project for licensing information.