diff --git a/src/main.rs b/src/main.rs index ef68ee8..5b35e7a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,9 +6,7 @@ mod shared; mod ui_server; fn init_logging() { - env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")) - .format_timestamp_millis() - .init(); + botlib::logging::init_compact_logger("info"); } fn get_port() -> u16 { diff --git a/src/ui_server/mod.rs b/src/ui_server/mod.rs index ea345ab..1560994 100644 --- a/src/ui_server/mod.rs +++ b/src/ui_server/mod.rs @@ -46,6 +46,16 @@ const SUITE_DIRS: &[&str] = &[ "tools", "assets", "partials", + "video", + "learn", + "social", + "dashboards", + "designer", + "workspace", + "project", + "goals", + "player", + "canvas", ]; pub async fn index() -> impl IntoResponse { diff --git a/ui/suite/canvas/canvas.html b/ui/suite/canvas/canvas.html new file mode 100644 index 0000000..2f7d48a --- /dev/null +++ b/ui/suite/canvas/canvas.html @@ -0,0 +1,992 @@ + + +
+ + + + +
+ +
+
+ + Saved +
+
+
+ + 100% + + + +
+
+
+ + +
+ + + +
+
+ + +
+ + +
+
+ + +
+ +
+
+
+ + + + + +
+
+ +
+
+ + + + + + +
+ + + + diff --git a/ui/suite/home.html b/ui/suite/home.html index 0343e4d..4927199 100644 --- a/ui/suite/home.html +++ b/ui/suite/home.html @@ -1,660 +1,1148 @@ - - - - - - General Bots Suite - - - - - -
-
- -

General Bots Suite

-

- Your AI-powered productivity workspace. Chat, collaborate, - and create. -

-
- -
-

Quick Actions

- -
- -
-

Applications

-
- -
๐Ÿ’ฌ
-
Chat
-
- AI-powered conversations. Ask questions, get help, - and automate tasks. -
-
- - -
๐Ÿ“
-
Drive
-
- Cloud storage for all your files. Upload, organize, - and share. -
-
- - -
โœ“
-
Tasks
-
- Stay organized with to-do lists, priorities, and due - dates. -
-
- - -
โœ‰๏ธ
-
Mail
-
- Email client with AI-assisted writing and smart - organization. -
-
- - -
๐Ÿ“…
-
Calendar
-
- Schedule meetings, events, and manage your time - effectively. -
-
- - -
๐ŸŽฅ
-
Meet
-
- Video conferencing with screen sharing and live - transcription. -
-
- - -
๐Ÿ“
-
Paper
-
- Write documents with AI assistance. Notes, reports, - and more. -
-
- - -
๐Ÿ“Š
-
Sheet
-
- Spreadsheets with formulas, charts, and real-time - collaboration. -
-
- - -
๐Ÿ“ฝ๏ธ
-
Slides
-
- Create presentations with themes, animations, and - collaboration. -
-
- - -
๐Ÿ”
-
Research
-
- AI-powered search and discovery across all your - sources. -
-
- - -
๐Ÿ“Š
-
Analytics
-
- Dashboards and reports to track usage and insights. -
-
- - -
๐Ÿ“ฆ
-
Sources
-
- Repositories, Apps, Prompts, Templates and MCP - Servers. -
-
- - -
๐Ÿ‘ค
-
Attendant
-
- Human agent console for CRM and conversation - management. -
-
- - -
๐Ÿ“ก
-
Monitoring
-
- System health, logs, metrics and real-time - monitoring. -
-
- - -
๐Ÿ› ๏ธ
-
Tools
-
- Compliance scanning, security checks and bot - utilities. -
-
- - -
โš™๏ธ
-
Settings
-
- Personal preferences, administration and account - settings. -
-
-
-
- -
-

Recent Activity

-
- {% for item in recent_items %} -
-
{{ item.icon }}
-
-
{{ item.name }}
-
- {{ item.app }} โ€ข {{ item.description }} -
-
-
{{ item.time }}
-
- {% endfor %} {% if recent_items.is_empty() %} -
-
- ๐Ÿš€ -
-

No recent activity yet. Start exploring!

-
- {% endif %} -
-
+
+ +
+
+

Welcome back

+

+ Your AI-powered workspace. What would you like to do today? +

+ +
- - - + }); + + async function loadRecentDocuments() { + try { + const response = await fetch("/api/activity/recent"); + if (response.ok) { + const items = await response.json(); + renderRecentDocuments(items); + } + } catch (error) { + console.log("Using placeholder recent documents"); + } + } + + function renderRecentDocuments(items) { + if (!items || items.length === 0) return; + + const container = document.getElementById("recent-documents"); + container.innerHTML = items + .slice(0, 4) + .map( + (item) => ` +
+
+ ${getIconForType(item.type)} +
+
+ ${item.name} + ${item.meta} +
+
+ `, + ) + .join(""); + } + + function getIconForType(type) { + const icons = { + doc: '', + sheet: '', + slides: '', + paper: '', + }; + return icons[type] || icons.doc; + } + diff --git a/ui/suite/index.html b/ui/suite/index.html index 1cd4d68..8ac3437 100644 --- a/ui/suite/index.html +++ b/ui/suite/index.html @@ -95,7 +95,9 @@
Attendant + + + + + Project + + + + + + Canvas + + + + + + Goals + + + + + + Player + + + + + + Workspace + + + + + + Video + + + + + + Learn + + + + + + Settings +
diff --git a/ui/suite/js/i18n.js b/ui/suite/js/i18n.js index 28c76b4..3c81184 100644 --- a/ui/suite/js/i18n.js +++ b/ui/suite/js/i18n.js @@ -28,6 +28,12 @@ "nav-tools": "Tools", "nav-attendant": "Attendant", "nav-settings": "Settings", + "nav-workspace": "Workspace", + "nav-project": "Project", + "nav-goals": "Goals", + "nav-security": "Security", + "nav-player": "Player", + "nav-canvas": "Canvas", "nav-search": "Search...", "nav-all-apps": "All Applications", "dashboard-title": "Dashboard", @@ -461,6 +467,66 @@ "a11y-loading": "Loading, please wait", "a11y-menu-open": "Open menu", "a11y-menu-close": "Close menu", + "workspace-title": "Workspace", + "workspace-new-page": "New Page", + "workspace-search-pages": "Search pages...", + "workspace-recent": "Recent", + "workspace-favorites": "Favorites", + "workspace-shared": "Shared with me", + "workspace-trash": "Trash", + "workspace-settings": "Workspace Settings", + "workspace-members": "Members", + "workspace-templates": "Templates", + "project-title": "Project", + "project-new": "New Project", + "project-tasks": "Tasks", + "project-timeline": "Timeline", + "project-gantt": "Gantt Chart", + "project-resources": "Resources", + "project-milestones": "Milestones", + "project-critical-path": "Critical Path", + "project-progress": "Progress", + "goals-title": "Goals (OKR)", + "goals-objectives": "Objectives", + "goals-key-results": "Key Results", + "goals-new-objective": "New Objective", + "goals-new-key-result": "New Key Result", + "goals-progress": "Progress", + "goals-check-in": "Check-in", + "goals-alignment": "Alignment", + "goals-dashboard": "OKR Dashboard", + "goals-periods": "Periods", + "security-title": "Security", + "security-overview": "Security Overview", + "security-tls": "TLS Settings", + "security-cors": "CORS Settings", + "security-rate-limit": "Rate Limiting", + "security-api-keys": "API Keys", + "security-audit": "Audit Log", + "security-mfa": "Multi-Factor Auth", + "security-sessions": "Active Sessions", + "security-password-policy": "Password Policy", + "security-scan": "Run Security Scan", + "player-title": "Player", + "player-play": "Play", + "player-pause": "Pause", + "player-stop": "Stop", + "player-volume": "Volume", + "player-fullscreen": "Fullscreen", + "player-download": "Download", + "player-next": "Next", + "player-previous": "Previous", + "canvas-title": "Canvas", + "canvas-new": "New Canvas", + "canvas-draw": "Draw", + "canvas-shapes": "Shapes", + "canvas-text": "Text", + "canvas-image": "Image", + "canvas-undo": "Undo", + "canvas-redo": "Redo", + "canvas-clear": "Clear", + "canvas-export": "Export", + "canvas-collaborate": "Collaborate", }, "pt-BR": { "app-name": "General Bots", @@ -484,6 +550,12 @@ "nav-tools": "Ferramentas", "nav-attendant": "Atendente", "nav-settings": "Configuraรงรตes", + "nav-workspace": "รrea de Trabalho", + "nav-project": "Projeto", + "nav-goals": "Metas", + "nav-security": "Seguranรงa", + "nav-player": "Player", + "nav-canvas": "Canvas", "nav-search": "Buscar...", "nav-all-apps": "Todos os Aplicativos", "dashboard-title": "Painel", @@ -922,6 +994,66 @@ "a11y-loading": "Carregando, por favor aguarde", "a11y-menu-open": "Abrir menu", "a11y-menu-close": "Fechar menu", + "workspace-title": "รrea de Trabalho", + "workspace-new-page": "Nova Pรกgina", + "workspace-search-pages": "Buscar pรกginas...", + "workspace-recent": "Recentes", + "workspace-favorites": "Favoritos", + "workspace-shared": "Compartilhados comigo", + "workspace-trash": "Lixeira", + "workspace-settings": "Configuraรงรตes do Espaรงo", + "workspace-members": "Membros", + "workspace-templates": "Modelos", + "project-title": "Projeto", + "project-new": "Novo Projeto", + "project-tasks": "Tarefas", + "project-timeline": "Linha do Tempo", + "project-gantt": "Grรกfico de Gantt", + "project-resources": "Recursos", + "project-milestones": "Marcos", + "project-critical-path": "Caminho Crรญtico", + "project-progress": "Progresso", + "goals-title": "Metas (OKR)", + "goals-objectives": "Objetivos", + "goals-key-results": "Resultados-Chave", + "goals-new-objective": "Novo Objetivo", + "goals-new-key-result": "Novo Resultado-Chave", + "goals-progress": "Progresso", + "goals-check-in": "Check-in", + "goals-alignment": "Alinhamento", + "goals-dashboard": "Painel OKR", + "goals-periods": "Perรญodos", + "security-title": "Seguranรงa", + "security-overview": "Visรฃo Geral de Seguranรงa", + "security-tls": "Configuraรงรตes TLS", + "security-cors": "Configuraรงรตes CORS", + "security-rate-limit": "Limitaรงรฃo de Taxa", + "security-api-keys": "Chaves de API", + "security-audit": "Log de Auditoria", + "security-mfa": "Autenticaรงรฃo Multi-Fator", + "security-sessions": "Sessรตes Ativas", + "security-password-policy": "Polรญtica de Senhas", + "security-scan": "Executar Verificaรงรฃo", + "player-title": "Player", + "player-play": "Reproduzir", + "player-pause": "Pausar", + "player-stop": "Parar", + "player-volume": "Volume", + "player-fullscreen": "Tela Cheia", + "player-download": "Baixar", + "player-next": "Prรณximo", + "player-previous": "Anterior", + "canvas-title": "Canvas", + "canvas-new": "Novo Canvas", + "canvas-draw": "Desenhar", + "canvas-shapes": "Formas", + "canvas-text": "Texto", + "canvas-image": "Imagem", + "canvas-undo": "Desfazer", + "canvas-redo": "Refazer", + "canvas-clear": "Limpar", + "canvas-export": "Exportar", + "canvas-collaborate": "Colaborar", }, }; diff --git a/ui/suite/people/people.css b/ui/suite/people/people.css new file mode 100644 index 0000000..6df384a --- /dev/null +++ b/ui/suite/people/people.css @@ -0,0 +1,622 @@ +.people-container { + display: flex; + flex-direction: column; + height: 100%; + background: var(--bg-primary); + position: relative; +} + +.people-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px 24px; + border-bottom: 1px solid var(--border-color); + background: var(--bg-secondary); +} + +.people-header h1 { + margin: 0; + font-size: 1.5rem; + color: var(--text-primary); +} + +.header-subtitle { + margin: 4px 0 0 0; + font-size: 0.875rem; + color: var(--text-secondary); +} + +.header-actions { + display: flex; + gap: 12px; + align-items: center; +} + +.search-box { + position: relative; + display: flex; + align-items: center; +} + +.search-box svg { + position: absolute; + left: 12px; + color: var(--text-secondary); + pointer-events: none; +} + +.search-box input { + padding: 10px 12px 10px 40px; + border: 1px solid var(--border-color); + border-radius: 8px; + background: var(--bg-primary); + color: var(--text-primary); + font-size: 0.875rem; + width: 280px; + transition: border-color 0.2s, box-shadow 0.2s; +} + +.search-box input:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 3px var(--accent-color-alpha, rgba(99, 102, 241, 0.1)); +} + +.search-box input::placeholder { + color: var(--text-tertiary); +} + +.btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 10px 16px; + border: none; + border-radius: 8px; + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; +} + +.btn-primary { + background: var(--accent-color); + color: white; +} + +.btn-primary:hover { + background: var(--accent-hover); + transform: translateY(-1px); +} + +.btn-secondary { + background: var(--bg-secondary); + color: var(--text-primary); + border: 1px solid var(--border-color); +} + +.btn-secondary:hover { + background: var(--bg-tertiary); +} + +.tab-nav { + display: flex; + gap: 4px; + padding: 12px 24px; + border-bottom: 1px solid var(--border-color); + background: var(--bg-secondary); +} + +.tab-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 16px; + border: none; + border-radius: 8px; + background: transparent; + color: var(--text-secondary); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; +} + +.tab-btn:hover { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.tab-btn.active { + background: var(--accent-color); + color: white; +} + +.tab-btn svg { + flex-shrink: 0; +} + +.people-content { + flex: 1; + overflow: hidden; + position: relative; +} + +.tab-content { + display: none; + height: 100%; + overflow-y: auto; +} + +.tab-content.active { + display: block; +} + +.alphabet-filter { + display: flex; + flex-wrap: wrap; + gap: 4px; + padding: 12px 24px; + border-bottom: 1px solid var(--border-color); + background: var(--bg-secondary); +} + +.alpha-btn { + padding: 6px 10px; + border: none; + border-radius: 6px; + background: transparent; + color: var(--text-secondary); + font-size: 0.75rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + min-width: 28px; +} + +.alpha-btn:hover { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.alpha-btn.active { + background: var(--accent-color); + color: white; +} + +.contacts-list { + padding: 16px 24px; +} + +.contact-group { + margin-bottom: 24px; +} + +.group-header { + font-size: 0.75rem; + font-weight: 700; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.05em; + padding: 8px 0; + border-bottom: 1px solid var(--border-color); + margin-bottom: 8px; +} + +.group-contacts { + display: flex; + flex-direction: column; + gap: 4px; +} + +.contact-card { + display: flex; + align-items: center; + gap: 12px; + padding: 12px 16px; + border-radius: 10px; + cursor: pointer; + transition: all 0.2s; +} + +.contact-card:hover { + background: var(--bg-secondary); +} + +.contact-avatar { + width: 44px; + height: 44px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 1rem; + font-weight: 600; + color: white; + flex-shrink: 0; +} + +.contact-avatar.large { + width: 80px; + height: 80px; + font-size: 1.75rem; +} + +.contact-info { + flex: 1; + min-width: 0; +} + +.contact-name { + font-size: 0.9375rem; + font-weight: 500; + color: var(--text-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.contact-detail { + font-size: 0.8125rem; + color: var(--text-secondary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 2px; +} + +.contact-actions { + display: flex; + gap: 4px; + opacity: 0; + transition: opacity 0.2s; +} + +.contact-card:hover .contact-actions { + opacity: 1; +} + +.icon-btn { + display: flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + border: none; + border-radius: 8px; + background: transparent; + color: var(--text-secondary); + cursor: pointer; + transition: all 0.2s; +} + +.icon-btn:hover { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.icon-btn.small { + width: 32px; + height: 32px; +} + +.contact-panel { + position: absolute; + top: 0; + right: 0; + width: 400px; + height: 100%; + background: var(--bg-primary); + border-left: 1px solid var(--border-color); + box-shadow: -4px 0 20px rgba(0, 0, 0, 0.1); + transform: translateX(100%); + transition: transform 0.3s ease; + display: flex; + flex-direction: column; + z-index: 100; +} + +.contact-panel.open { + transform: translateX(0); +} + +.panel-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 20px; + border-bottom: 1px solid var(--border-color); +} + +.panel-actions { + display: flex; + gap: 8px; +} + +.close-btn { + display: flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + border: none; + border-radius: 8px; + background: transparent; + color: var(--text-secondary); + cursor: pointer; + transition: all 0.2s; +} + +.close-btn:hover { + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.panel-content { + flex: 1; + overflow-y: auto; + padding: 24px 20px; +} + +.contact-header { + text-align: center; + padding-bottom: 24px; + border-bottom: 1px solid var(--border-color); + margin-bottom: 24px; +} + +.contact-header h2 { + margin: 16px 0 4px 0; + font-size: 1.25rem; + color: var(--text-primary); +} + +.contact-title { + margin: 0; + font-size: 0.875rem; + color: var(--text-secondary); +} + +.contact-company { + margin: 4px 0 0 0; + font-size: 0.8125rem; + color: var(--text-tertiary); +} + +.contact-fields { + display: flex; + flex-direction: column; + gap: 16px; + margin-bottom: 24px; +} + +.field label { + display: block; + font-size: 0.75rem; + font-weight: 600; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: 4px; +} + +.field a, +.field p { + margin: 0; + font-size: 0.9375rem; + color: var(--text-primary); +} + +.field a { + color: var(--accent-color); + text-decoration: none; +} + +.field a:hover { + text-decoration: underline; +} + +.contact-quick-actions { + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +.action-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 16px; + border: 1px solid var(--border-color); + border-radius: 8px; + background: var(--bg-secondary); + color: var(--text-primary); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; +} + +.action-btn:hover { + background: var(--bg-tertiary); + border-color: var(--accent-color); +} + +.modal { + border: none; + border-radius: 16px; + padding: 0; + max-width: 500px; + width: 90%; + background: var(--bg-primary); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); +} + +.modal::backdrop { + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(4px); +} + +.modal-content { + padding: 24px; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 24px; +} + +.modal-header h2 { + margin: 0; + font-size: 1.25rem; + color: var(--text-primary); +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; +} + +.form-group { + margin-bottom: 16px; +} + +.form-group label { + display: block; + font-size: 0.875rem; + font-weight: 500; + color: var(--text-primary); + margin-bottom: 6px; +} + +.form-group input, +.form-group textarea { + width: 100%; + padding: 10px 12px; + border: 1px solid var(--border-color); + border-radius: 8px; + background: var(--bg-secondary); + color: var(--text-primary); + font-size: 0.875rem; + font-family: inherit; + transition: border-color 0.2s, box-shadow 0.2s; +} + +.form-group input:focus, +.form-group textarea:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 3px var(--accent-color-alpha, rgba(99, 102, 241, 0.1)); +} + +.form-group textarea { + resize: vertical; + min-height: 80px; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; + padding-top: 16px; + border-top: 1px solid var(--border-color); +} + +.empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 60px 24px; + text-align: center; + color: var(--text-secondary); +} + +.empty-state svg { + margin-bottom: 16px; + opacity: 0.5; +} + +.empty-state h3 { + margin: 0 0 8px 0; + font-size: 1.125rem; + color: var(--text-primary); +} + +.empty-state p { + margin: 0 0 24px 0; + font-size: 0.875rem; +} + +.loading-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 60px 24px; + color: var(--text-secondary); +} + +.spinner { + width: 32px; + height: 32px; + border: 3px solid var(--border-color); + border-top-color: var(--accent-color); + border-radius: 50%; + animation: spin 0.8s linear infinite; + margin-bottom: 16px; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.groups-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 16px; + padding: 24px; +} + +.directory-tree { + padding: 24px; +} + +.recent-list { + padding: 16px 24px; +} + +@media (max-width: 768px) { + .people-header { + flex-direction: column; + gap: 16px; + align-items: stretch; + } + + .header-actions { + flex-direction: column; + } + + .search-box input { + width: 100%; + } + + .contact-panel { + width: 100%; + } + + .form-row { + grid-template-columns: 1fr; + } + + .alphabet-filter { + justify-content: center; + } +} diff --git a/ui/suite/people/people.html b/ui/suite/people/people.html new file mode 100644 index 0000000..665d20f --- /dev/null +++ b/ui/suite/people/people.html @@ -0,0 +1,527 @@ + + +
+ +
+
+

People

+

+ Contacts, Groups & Directory +

+
+
+ + +
+
+ + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+

Loading contacts...

+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+
+ + +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + + + diff --git a/ui/suite/player/player.html b/ui/suite/player/player.html new file mode 100644 index 0000000..7aec989 --- /dev/null +++ b/ui/suite/player/player.html @@ -0,0 +1,1003 @@ + + +
+ + + + +
+ +
+
+

No file selected

+
+ -- + -- + -- +
+
+
+ + + +
+
+ + +
+ + + + + + + + + + + + + + + + +
+
๐ŸŽฌ
+

No Media Selected

+

Select a file from the sidebar to start viewing

+
+

Supported Formats

+
+
+ ๐ŸŽฌ + MP4, WebM, OGV +
+
+ ๐ŸŽต + MP3, WAV, OGG +
+
+ ๐Ÿ“„ + PDF, TXT, MD +
+
+ ๐Ÿ–ผ๏ธ + PNG, JPG, GIF +
+
+
+
+
+ + + +
+ + + +
+ + + + diff --git a/ui/suite/project/project.html b/ui/suite/project/project.html new file mode 100644 index 0000000..fe2c0e3 --- /dev/null +++ b/ui/suite/project/project.html @@ -0,0 +1,758 @@ + + +
+ + + + +
+ +
+
+

Select a Project

+
+ + + No project selected + + + Progress: + -- + +
+
+
+
+ + + + +
+ +
+
+ + +
+ +
+
+
+ + + + +
+
+ + +
+ +
+ +
+
+
+
Task Name
+
Start
+
End
+
Duration
+
Progress
+
Assignee
+
+
+
+ Select a project to view tasks +
+
+
+ +
+
+ +
+
+
+

No tasks to display

+
+
+
+
+
+ + +
+
+
Select a project to view timeline
+
+
+ + +
+
+
Select a project to view tasks
+
+
+ + +
+
+
+

Not Started

+
+
+
+

In Progress

+
+
+
+

Completed

+
+
+
+
+
+ + +
+
๐Ÿ“‹
+

No Project Selected

+

Select a project from the sidebar or create a new one

+ +
+
+ + + + + + +
+ + + + diff --git a/ui/suite/workspace/workspace.html b/ui/suite/workspace/workspace.html new file mode 100644 index 0000000..0a9df15 --- /dev/null +++ b/ui/suite/workspace/workspace.html @@ -0,0 +1,535 @@ + + +
+ + + + +
+
+ + + + +
+
+ +
+

Press / for commands or start typing...

+
+
+ + + +
+
+ + + +
+ + + + + + +
+ + + +