A tree view component for displaying hierarchical file and folder structures with expand/collapse functionality.
ITreeDataProvider interface<qds-tree-view id="myTree" width="300px"></qds-tree-view>
<script type="module">
import { AzureStorageTreeProvider } from './providers/AzureStorageTreeProvider.js';
const provider = new AzureStorageTreeProvider({
storageAccount: 'your-storage-account',
container: 'your-container',
authMethod: 'quantum-auth'
});
const treeView = document.getElementById('myTree');
treeView.dataProvider = provider;
</script>
<qds-tree-view
width="250px"
resizable>
</qds-tree-view>
| Attribute | Type | Default | Description |
|---|---|---|---|
width |
string | 300px |
Initial width of the tree view |
resizable |
boolean | false |
Whether the tree view can be resized by dragging |
dataProviderSet the data provider for the tree view.
const provider = new AzureStorageTreeProvider(config);
treeView.dataProvider = provider;
selectedNodeGet the currently selected node (read-only).
const selected = treeView.selectedNode;
console.log(selected.name, selected.type);
file-selectedFired when a file node is selected.
treeView.addEventListener('file-selected', (event) => {
const { node } = event.detail;
console.log('File selected:', node.name);
});
Detail:
{
node: TreeNode
}
folder-expandedFired when a folder is expanded.
treeView.addEventListener('folder-expanded', (event) => {
const { node } = event.detail;
console.log('Folder expanded:', node.name);
});
Detail:
{
node: TreeNode
}
folder-collapsedFired when a folder is collapsed.
treeView.addEventListener('folder-collapsed', (event) => {
const { node } = event.detail;
console.log('Folder collapsed:', node.name);
});
Detail:
{
node: TreeNode
}
node-selectedFired when any node (file or folder) is selected.
treeView.addEventListener('node-selected', (event) => {
const { node } = event.detail;
console.log('Node selected:', node.name, node.type);
});
Detail:
{
node: TreeNode
}
| Key | Action |
|---|---|
| ↑ | Move to previous visible node |
| ↓ | Move to next visible node |
| → | Expand folder or move to first child |
| ← | Collapse folder or move to parent |
| Enter / Space | Toggle folder or select file |
You can style the tree view using CSS shadow parts:
qds-tree-view::part(container) {
background-color: #f5f5f5;
}
qds-tree-view::part(tree) {
padding: 16px;
}
qds-tree-view::part(node) {
/* Style all nodes */
}
qds-tree-view::part(folder) {
/* Style folder nodes */
}
qds-tree-view::part(file) {
/* Style file nodes */
}
qds-tree-view::part(resize-handle) {
/* Style resize handle */
}
The tree view uses the ITreeDataProvider interface for data operations. This allows it to work with various storage backends.
import { AzureStorageTreeProvider } from './providers/AzureStorageTreeProvider.js';
const provider = new AzureStorageTreeProvider({
storageAccount: 'your-storage-account',
container: 'your-container',
authMethod: 'quantum-auth',
basePath: 'diagrams/', // Optional: filter to specific path
allowedExtensions: ['.drawio', '.svg'], // Optional: filter by extension
lazyLoad: false, // Optional: lazy-load children
cacheTTL: 0 // Optional: cache duration (0 = indefinite)
});
treeView.dataProvider = provider;
class StaticTreeProvider {
constructor(data) {
this.data = data;
this.eventHandlers = new Map();
}
async getRootNodes() {
return this.data;
}
async getChildren(nodeId) {
const node = this._findNode(nodeId, this.data);
return node?.items || [];
}
// Implement other ITreeDataProvider methods...
}
const sampleData = [
{
id: 'folder1',
name: 'Folder 1',
type: 'folder',
path: 'folder1',
icon: 'assets/icons/folder.svg',
parentId: null,
items: [
{
id: 'folder1/file1.drawio',
name: 'file1.drawio',
type: 'file',
path: 'folder1/file1.drawio',
icon: 'assets/icons/diagram.svg',
parentId: 'folder1'
}
]
}
];
const provider = new StaticTreeProvider(sampleData);
treeView.dataProvider = provider;
Nodes in the tree follow this structure:
interface TreeNode {
id: string; // Unique identifier (full path)
name: string; // Display name
type: 'folder' | 'file'; // Node type
path: string; // Full path from root
icon?: string; // Icon path
parentId?: string | null; // Parent node ID
items?: TreeNode[]; // Child nodes (for folders)
childrenLoaded?: boolean; // Whether children have been loaded
expanded?: boolean; // UI state
selected?: boolean; // UI state
metadata?: { // Optional metadata
extension?: string;
size?: number;
modified?: Date;
contentType?: string;
};
}
<div style="display: flex; height: 100vh;">
<qds-tree-view id="tree" width="300px" resizable></qds-tree-view>
<qds-diagram-host
id="diagram"
style="flex: 1;"
storage-account="your-account"
container="your-container"
editable>
</qds-diagram-host>
</div>
<script type="module">
import { AzureStorageTreeProvider } from './providers/AzureStorageTreeProvider.js';
const provider = new AzureStorageTreeProvider({
storageAccount: 'your-account',
container: 'your-container',
authMethod: 'quantum-auth',
allowedExtensions: ['.drawio']
});
const tree = document.getElementById('tree');
const diagram = document.getElementById('diagram');
tree.dataProvider = provider;
// Load diagram when file is selected
tree.addEventListener('file-selected', (e) => {
const { node } = e.detail;
const pathParts = node.path.split('/');
const fileName = pathParts.pop();
const dirPath = pathParts.join('/');
diagram.setAttribute('path', dirPath);
diagram.setAttribute('drawing-name', fileName);
});
</script>
<input type="text" id="searchInput" placeholder="Search files...">
<qds-tree-view id="tree"></qds-tree-view>
<script type="module">
const searchInput = document.getElementById('searchInput');
const tree = document.getElementById('tree');
searchInput.addEventListener('input', async (e) => {
const query = e.target.value;
if (!query) return;
const results = await tree.dataProvider.search(query);
console.log('Found:', results);
});
</script>
qds-diagram-host - Display and edit diagramsqds-diagram-manager - Complete diagram management interfaceAzureStorageTreeProvider - Azure Blob Storage backendITreeDataProvider - Data provider interfaceProprietary - Quantum Capital Group