Files
astrolabe-nvc/index.html
Oleh Omelchenko 615c2d7f98 Add Dataset Manager functionality with IndexedDB support
- Introduced a new modal for managing datasets, including options to create, view, and delete datasets.
- Implemented IndexedDB for persistent storage of datasets, allowing for efficient data retrieval and management.
- Added UI components for dataset details, including statistics and preview.
- Enhanced the app's JavaScript to handle dataset operations such as saving, updating, and deleting datasets.
- Integrated dataset reference resolution in the visualization editor to support dynamic data sources.
- Updated styles for the new modal and dataset management UI for improved user experience.
2025-10-13 18:17:09 +03:00

288 lines
15 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Astrolabe - Vega-Lite Snippet Manager</title>
<link rel="stylesheet" href="src/styles.css">
<!-- Monaco Editor -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.47.0/min/vs/loader.js"></script>
</head>
<body>
<!-- Header -->
<div class="header">
<div class="header-left">
<span class="header-icon">🔭</span>
<span class="header-title">Astrolabe</span>
</div>
<div class="header-links">
<span class="header-link" id="import-link">Import</span>
<span class="header-link" id="export-link">Export</span>
<span class="header-link" id="datasets-link">Datasets</span>
<span class="header-link" id="help-link">Help</span>
<input type="file" id="import-file-input" accept=".json" style="display: none;" />
</div>
</div>
<div class="app-container">
<!-- Toggle Button Strip -->
<div class="toggle-strip">
<button class="toggle-btn active" id="toggle-snippet-panel" title="Toggle Snippets Panel">
📄
</button>
<button class="toggle-btn active" id="toggle-editor-panel" title="Toggle Editor Panel">
✏️
</button>
<button class="toggle-btn active" id="toggle-preview-panel" title="Toggle Preview Panel">
👁️
</button>
<button class="toggle-btn" id="toggle-datasets" title="Datasets">
📁
</button>
</div>
<div class="main-panels">
<!-- Snippet Library Panel -->
<div class="panel snippet-panel" id="snippet-panel">
<div class="panel-header">
Snippets
</div>
<div class="sort-controls">
<span class="sort-label">Sort by:</span>
<button class="sort-btn active" data-sort="modified">
<span class="sort-text">Modified</span>
<span class="sort-arrow"></span>
</button>
<button class="sort-btn" data-sort="created">
<span class="sort-text">Created</span>
<span class="sort-arrow"></span>
</button>
<button class="sort-btn" data-sort="name">
<span class="sort-text">Name</span>
<span class="sort-arrow"></span>
</button>
</div>
<div class="search-controls">
<input type="text" id="snippet-search" placeholder="Search snippets..." />
<button class="search-clear-btn" id="search-clear" title="Clear search">×</button>
</div>
<div class="panel-content">
<ul class="snippet-list">
<!-- Dynamically populated by renderSnippetList() -->
</ul>
<div class="placeholder">
Click to select a snippet
</div>
<div class="snippet-meta" id="snippet-meta" style="display: none;">
<div class="meta-header">Name</div>
<input type="text" id="snippet-name" placeholder="Snippet name..." />
<div class="meta-header">Comment</div>
<textarea id="snippet-comment" placeholder="Add a comment..." rows="3"></textarea>
<div class="meta-info">
<div class="meta-info-item">
<span class="meta-info-label">Created:</span>
<span id="snippet-created"></span>
</div>
<div class="meta-info-item">
<span class="meta-info-label">Modified:</span>
<span id="snippet-modified"></span>
</div>
</div>
<div class="meta-actions">
<button class="meta-btn" id="duplicate-btn">Duplicate</button>
<button class="meta-btn delete-btn" id="delete-btn">Delete</button>
</div>
</div>
<div class="storage-monitor" id="storage-monitor">
<div class="storage-info">
<span class="storage-label">Storage:</span>
<span class="storage-text" id="storage-text">0 KB / 5 MB</span>
</div>
<div class="storage-bar">
<div class="storage-fill" id="storage-fill"></div>
</div>
</div>
</div>
</div>
<!-- Resize Handle 1 -->
<div class="resize-handle" id="resize-handle-1"></div>
<!-- Editor Panel -->
<div class="panel editor-panel" id="editor-panel">
<div class="panel-header">
<span>Editor</span>
<div class="editor-controls">
<button class="action-btn publish-btn" id="publish-btn">Publish</button>
<button class="action-btn revert-btn" id="revert-btn">Revert</button>
<span class="view-label">View:</span>
<div class="view-toggle-group">
<button class="view-toggle-btn active" id="view-draft">Draft</button>
<button class="view-toggle-btn" id="view-published">Published</button>
</div>
</div>
</div>
<div class="panel-content">
<div id="monaco-editor" style="height: 100%; width: 100%;"></div>
</div>
</div>
<!-- Resize Handle 2 -->
<div class="resize-handle" id="resize-handle-2"></div>
<!-- Preview Panel -->
<div class="panel preview-panel" id="preview-panel">
<div class="panel-header">
Preview
</div>
<div class="panel-content">
<div id="vega-preview" style="height: 100%; width: 100%; overflow: auto;"></div>
</div>
</div>
</div>
</div>
<!-- Dataset Manager Modal -->
<div id="dataset-modal" class="modal" style="display: none;">
<div class="modal-content">
<div class="modal-header">
<span class="modal-title">Dataset Manager</span>
<button class="modal-close" id="dataset-modal-close">×</button>
</div>
<div class="modal-body">
<!-- List View (default) -->
<div id="dataset-list-view" class="dataset-view">
<div class="dataset-list-header">
<button class="modal-btn primary" id="new-dataset-btn">New Dataset</button>
</div>
<div class="dataset-container">
<div class="dataset-list" id="dataset-list">
<!-- Dynamically populated by renderDatasetList() -->
</div>
<div class="dataset-details" id="dataset-details" style="display: none;">
<div class="dataset-detail-section">
<div class="dataset-detail-header">Name</div>
<input type="text" id="dataset-detail-name" class="dataset-input" placeholder="Dataset name..." />
<div class="dataset-detail-header">Comment</div>
<textarea id="dataset-detail-comment" class="dataset-textarea" placeholder="Add a comment..." rows="3"></textarea>
<div class="dataset-detail-header-row">
<span class="dataset-detail-header">Statistics</span>
<button class="dataset-refresh-btn" id="refresh-metadata-btn" style="display: none;" title="Refresh metadata from URL">🔄</button>
</div>
<div class="dataset-stats">
<div class="dataset-stat-item">
<span class="dataset-stat-label">Rows:</span>
<span id="dataset-detail-rows">0</span>
</div>
<div class="dataset-stat-item">
<span class="dataset-stat-label">Columns:</span>
<span id="dataset-detail-columns">0</span>
</div>
<div class="dataset-stat-item">
<span class="dataset-stat-label">Size:</span>
<span id="dataset-detail-size">0 B</span>
</div>
</div>
<div class="dataset-detail-header">Timestamps</div>
<div class="dataset-stats">
<div class="dataset-stat-item">
<span class="dataset-stat-label">Created:</span>
<span id="dataset-detail-created">-</span>
</div>
<div class="dataset-stat-item">
<span class="dataset-stat-label">Modified:</span>
<span id="dataset-detail-modified">-</span>
</div>
</div>
<div class="dataset-detail-header">Preview</div>
<pre id="dataset-preview" class="dataset-preview-box"></pre>
<div class="dataset-actions">
<button class="modal-btn" id="copy-reference-btn">Copy Reference</button>
<button class="modal-btn delete-btn" id="delete-dataset-btn">Delete</button>
</div>
</div>
</div>
</div>
</div>
<!-- Form View (for creating new datasets) -->
<div id="dataset-form-view" class="dataset-view" style="display: none;">
<div class="dataset-form">
<div class="dataset-form-header">Create New Dataset</div>
<div class="dataset-form-group">
<label class="dataset-form-label">Name *</label>
<input type="text" id="dataset-form-name" class="dataset-input" placeholder="Enter dataset name..." />
</div>
<div class="dataset-form-group">
<div class="dataset-toggle-row">
<div class="dataset-toggle-section">
<span class="dataset-toggle-label">Source:</span>
<div class="dataset-toggle-group">
<button class="dataset-toggle-btn active" data-source="inline" type="button">Inline</button>
<button class="dataset-toggle-btn" data-source="url" type="button">URL</button>
</div>
</div>
<div class="dataset-toggle-section">
<span class="dataset-toggle-label">Format:</span>
<div class="dataset-toggle-group">
<button class="dataset-toggle-btn active" data-format="json" type="button">JSON</button>
<button class="dataset-toggle-btn" data-format="csv" type="button">CSV</button>
<button class="dataset-toggle-btn" data-format="tsv" type="button">TSV</button>
<button class="dataset-toggle-btn" data-format="topojson" type="button">TopoJSON</button>
</div>
</div>
</div>
</div>
<div class="dataset-form-group" id="dataset-url-group" style="display: none;">
<label class="dataset-form-label">URL *</label>
<input type="text" id="dataset-form-url" class="dataset-input" placeholder="https://example.com/data.csv" />
</div>
<div class="dataset-form-group" id="dataset-data-group">
<label class="dataset-form-label">Data *</label>
<div class="dataset-format-hint" id="dataset-format-hint">
JSON array of objects: [{"col1": "value", "col2": 123}, ...]
</div>
<textarea id="dataset-form-data" class="dataset-textarea" placeholder='[{"col1": "value", "col2": 123}, ...]' rows="12"></textarea>
</div>
<div class="dataset-form-group">
<label class="dataset-form-label">Comment</label>
<textarea id="dataset-form-comment" class="dataset-textarea" placeholder="Optional description..." rows="3"></textarea>
</div>
<div class="dataset-form-error" id="dataset-form-error"></div>
<div class="dataset-form-actions">
<button class="modal-btn primary" id="save-dataset-btn">Save Dataset</button>
<button class="modal-btn" id="cancel-dataset-btn">Cancel</button>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="src/js/config.js"></script>
<script src="src/js/snippet-manager.js"></script>
<script src="src/js/dataset-manager.js"></script>
<script src="src/js/panel-manager.js"></script>
<script src="src/js/editor.js"></script>
<script src="src/js/app.js"></script>
</body>
</html>