@agenticmail/enterprise 0.4.3 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +608 -923
- package/dashboards/django/app.py +12 -0
- package/dashboards/django/static/styles.css +449 -246
- package/dashboards/django/templates/activity.html +130 -0
- package/dashboards/django/templates/approvals.html +115 -0
- package/dashboards/django/templates/community-skills.html +89 -0
- package/dashboards/django/templates/domain-status.html +59 -0
- package/dashboards/django/templates/knowledge-contributions.html +58 -0
- package/dashboards/django/templates/knowledge.html +104 -0
- package/dashboards/django/templates/layout.html +161 -36
- package/dashboards/django/templates/skill-connections.html +73 -0
- package/dashboards/django/templates/workforce.html +116 -0
- package/dashboards/django/views/__init__.py +14 -0
- package/dashboards/django/views/new_pages.py +38 -0
- package/dashboards/dotnet/Program.cs +8 -0
- package/dashboards/dotnet/Routes/ActivityRoutes.cs +35 -0
- package/dashboards/dotnet/Routes/ApprovalRoutes.cs +36 -0
- package/dashboards/dotnet/Routes/CommunitySkillRoutes.cs +36 -0
- package/dashboards/dotnet/Routes/DomainStatusRoutes.cs +49 -0
- package/dashboards/dotnet/Routes/KnowledgeContributionRoutes.cs +42 -0
- package/dashboards/dotnet/Routes/KnowledgeRoutes.cs +40 -0
- package/dashboards/dotnet/Routes/SkillConnectionRoutes.cs +52 -0
- package/dashboards/dotnet/Routes/WorkforceRoutes.cs +55 -0
- package/dashboards/dotnet/Services/HtmlBuilder.cs +17 -8
- package/dashboards/dotnet/wwwroot/styles.css +508 -246
- package/dashboards/express/app.js +8 -0
- package/dashboards/express/public/styles.css +163 -272
- package/dashboards/express/routes/activity.js +101 -0
- package/dashboards/express/routes/approvals.js +100 -0
- package/dashboards/express/routes/community-skills.js +83 -0
- package/dashboards/express/routes/domain-status.js +78 -0
- package/dashboards/express/routes/knowledge-contributions.js +85 -0
- package/dashboards/express/routes/knowledge.js +83 -0
- package/dashboards/express/routes/skill-connections.js +86 -0
- package/dashboards/express/routes/workforce.js +126 -0
- package/dashboards/express/views/layout.js +54 -33
- package/dashboards/go/handlers/activity.go +30 -0
- package/dashboards/go/handlers/approvals.go +31 -0
- package/dashboards/go/handlers/community_skills.go +32 -0
- package/dashboards/go/handlers/domain_status.go +62 -0
- package/dashboards/go/handlers/knowledge.go +35 -0
- package/dashboards/go/handlers/knowledge_contributions.go +37 -0
- package/dashboards/go/handlers/skill_connections.go +59 -0
- package/dashboards/go/handlers/workforce.go +60 -0
- package/dashboards/go/main.go +8 -0
- package/dashboards/go/static/styles.css +508 -246
- package/dashboards/go/templates/layout.go +16 -11
- package/dashboards/html/index.html +136 -15
- package/dashboards/html/public/styles.css +531 -134
- package/dashboards/html/src/pages/activity.js +137 -0
- package/dashboards/html/src/pages/approvals.js +155 -0
- package/dashboards/html/src/pages/community-skills.js +236 -0
- package/dashboards/html/src/pages/domain-status.js +182 -0
- package/dashboards/html/src/pages/knowledge-contributions.js +319 -0
- package/dashboards/html/src/pages/knowledge.js +251 -0
- package/dashboards/html/src/pages/skill-connections.js +293 -0
- package/dashboards/html/src/pages/workforce.js +418 -0
- package/dashboards/html/src/router.js +51 -0
- package/dashboards/java/AgenticMailDashboard.java +8 -0
- package/dashboards/java/handlers/ActivityHandler.java +42 -0
- package/dashboards/java/handlers/ApprovalsHandler.java +43 -0
- package/dashboards/java/handlers/CommunitySkillsHandler.java +45 -0
- package/dashboards/java/handlers/DomainStatusHandler.java +58 -0
- package/dashboards/java/handlers/KnowledgeContributionsHandler.java +51 -0
- package/dashboards/java/handlers/KnowledgeHandler.java +49 -0
- package/dashboards/java/handlers/SkillConnectionsHandler.java +61 -0
- package/dashboards/java/handlers/WorkforceHandler.java +64 -0
- package/dashboards/java/static/styles.css +508 -250
- package/dashboards/java/templates/Layout.java +14 -6
- package/dashboards/laravel/controllers/ActivityController.php +18 -0
- package/dashboards/laravel/controllers/ApprovalsController.php +18 -0
- package/dashboards/laravel/controllers/CommunitySkillsController.php +18 -0
- package/dashboards/laravel/controllers/DomainStatusController.php +18 -0
- package/dashboards/laravel/controllers/KnowledgeContributionsController.php +18 -0
- package/dashboards/laravel/controllers/KnowledgeController.php +18 -0
- package/dashboards/laravel/controllers/SkillConnectionsController.php +18 -0
- package/dashboards/laravel/controllers/WorkforceController.php +18 -0
- package/dashboards/laravel/index.php +56 -0
- package/dashboards/laravel/public/styles.css +163 -279
- package/dashboards/laravel/views/activity.php +127 -0
- package/dashboards/laravel/views/approvals.php +152 -0
- package/dashboards/laravel/views/community-skills.php +131 -0
- package/dashboards/laravel/views/domain-status.php +167 -0
- package/dashboards/laravel/views/knowledge-contributions.php +185 -0
- package/dashboards/laravel/views/knowledge.php +167 -0
- package/dashboards/laravel/views/layout.php +54 -41
- package/dashboards/laravel/views/skill-connections.php +192 -0
- package/dashboards/laravel/views/workforce.php +265 -0
- package/dashboards/php/components/layout.php +21 -16
- package/dashboards/php/index.php +1 -1
- package/dashboards/php/pages/activity.php +35 -0
- package/dashboards/php/pages/approvals.php +36 -0
- package/dashboards/php/pages/community-skills.php +39 -0
- package/dashboards/php/pages/domain-status.php +87 -0
- package/dashboards/php/pages/knowledge-contributions.php +47 -0
- package/dashboards/php/pages/knowledge.php +43 -0
- package/dashboards/php/pages/skill-connections.php +94 -0
- package/dashboards/php/pages/workforce.php +89 -0
- package/dashboards/php/public/styles.css +168 -74
- package/dashboards/python/app.py +16 -0
- package/dashboards/python/routes/activity.py +11 -0
- package/dashboards/python/routes/approvals.py +11 -0
- package/dashboards/python/routes/community_skills.py +11 -0
- package/dashboards/python/routes/domain_status.py +11 -0
- package/dashboards/python/routes/knowledge.py +11 -0
- package/dashboards/python/routes/knowledge_contributions.py +11 -0
- package/dashboards/python/routes/skill_connections.py +11 -0
- package/dashboards/python/routes/workforce.py +11 -0
- package/dashboards/python/static/styles.css +163 -276
- package/dashboards/python/templates/activity.html +87 -0
- package/dashboards/python/templates/approvals.html +86 -0
- package/dashboards/python/templates/community-skills.html +69 -0
- package/dashboards/python/templates/domain-status.html +64 -0
- package/dashboards/python/templates/knowledge-contributions.html +71 -0
- package/dashboards/python/templates/knowledge.html +69 -0
- package/dashboards/python/templates/layout.html +103 -68
- package/dashboards/python/templates/skill-connections.html +72 -0
- package/dashboards/python/templates/workforce.html +112 -0
- package/dashboards/rails/app.rb +8 -0
- package/dashboards/rails/public/styles.css +506 -259
- package/dashboards/rails/routes/activity.rb +10 -0
- package/dashboards/rails/routes/approvals.rb +10 -0
- package/dashboards/rails/routes/community_skills.rb +11 -0
- package/dashboards/rails/routes/domain_status.rb +16 -0
- package/dashboards/rails/routes/knowledge.rb +11 -0
- package/dashboards/rails/routes/knowledge_contributions.rb +12 -0
- package/dashboards/rails/routes/skill_connections.rb +15 -0
- package/dashboards/rails/routes/workforce.rb +16 -0
- package/dashboards/rails/views/activity.erb +56 -0
- package/dashboards/rails/views/approvals.erb +60 -0
- package/dashboards/rails/views/community_skills.erb +69 -0
- package/dashboards/rails/views/domain_status.erb +75 -0
- package/dashboards/rails/views/knowledge.erb +67 -0
- package/dashboards/rails/views/knowledge_contributions.erb +70 -0
- package/dashboards/rails/views/layout.erb +23 -15
- package/dashboards/rails/views/skill_connections.erb +109 -0
- package/dashboards/rails/views/workforce.erb +124 -0
- package/dashboards/ruby/app.rb +8 -0
- package/dashboards/ruby/public/styles.css +506 -254
- package/dashboards/ruby/routes/activity.rb +10 -0
- package/dashboards/ruby/routes/approvals.rb +10 -0
- package/dashboards/ruby/routes/community_skills.rb +11 -0
- package/dashboards/ruby/routes/domain_status.rb +16 -0
- package/dashboards/ruby/routes/knowledge.rb +11 -0
- package/dashboards/ruby/routes/knowledge_contributions.rb +12 -0
- package/dashboards/ruby/routes/skill_connections.rb +15 -0
- package/dashboards/ruby/routes/workforce.rb +16 -0
- package/dashboards/ruby/views/activity.erb +56 -0
- package/dashboards/ruby/views/approvals.erb +60 -0
- package/dashboards/ruby/views/community_skills.erb +69 -0
- package/dashboards/ruby/views/domain_status.erb +75 -0
- package/dashboards/ruby/views/knowledge.erb +67 -0
- package/dashboards/ruby/views/knowledge_contributions.erb +70 -0
- package/dashboards/ruby/views/layout.erb +22 -13
- package/dashboards/ruby/views/skill_connections.erb +109 -0
- package/dashboards/ruby/views/workforce.erb +124 -0
- package/dashboards/shared/styles.css +505 -281
- package/dashboards/shared-styles.css +534 -45
- package/package.json +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
/**
|
|
3
|
+
* Skill Connections Page — Manage skill relationships and dependencies
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
layout_start('Skill Connections', 'skill-connections');
|
|
7
|
+
?>
|
|
8
|
+
|
|
9
|
+
<h2 class="title">Skill Connections</h2>
|
|
10
|
+
<p class="desc">Visualize and manage relationships between skills</p>
|
|
11
|
+
|
|
12
|
+
<div style="margin-bottom: 20px;">
|
|
13
|
+
<button class="btn btn-primary">+ Create Connection</button>
|
|
14
|
+
<button class="btn btn-secondary" style="margin-left: 10px;">View Network</button>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<div class="card">
|
|
18
|
+
<div class="card-t">Skill Network Overview</div>
|
|
19
|
+
<div class="empty">
|
|
20
|
+
<div class="empty-i">🔗</div>
|
|
21
|
+
<p>No skill connections configured</p>
|
|
22
|
+
<small>Create connections between skills to enable complex workflows</small>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px;">
|
|
27
|
+
<div class="card">
|
|
28
|
+
<div class="card-t">Connection Types</div>
|
|
29
|
+
<div style="padding: 20px;">
|
|
30
|
+
<div class="connection-type">
|
|
31
|
+
<span class="connection-indicator depends"></span>
|
|
32
|
+
<span>Dependencies</span>
|
|
33
|
+
<span class="badge">0</span>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="connection-type">
|
|
36
|
+
<span class="connection-indicator enhances"></span>
|
|
37
|
+
<span>Enhancements</span>
|
|
38
|
+
<span class="badge">0</span>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="connection-type">
|
|
41
|
+
<span class="connection-indicator conflicts"></span>
|
|
42
|
+
<span>Conflicts</span>
|
|
43
|
+
<span class="badge">0</span>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<div class="card">
|
|
49
|
+
<div class="card-t">Recent Changes</div>
|
|
50
|
+
<div class="empty">
|
|
51
|
+
<div class="empty-i">📋</div>
|
|
52
|
+
<p>No recent changes</p>
|
|
53
|
+
<small>Connection updates will appear here</small>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<style>
|
|
59
|
+
.connection-type {
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
gap: 12px;
|
|
63
|
+
padding: 12px 0;
|
|
64
|
+
border-bottom: 1px solid var(--border);
|
|
65
|
+
}
|
|
66
|
+
.connection-type:last-child {
|
|
67
|
+
border-bottom: none;
|
|
68
|
+
}
|
|
69
|
+
.connection-indicator {
|
|
70
|
+
width: 12px;
|
|
71
|
+
height: 12px;
|
|
72
|
+
border-radius: 3px;
|
|
73
|
+
flex-shrink: 0;
|
|
74
|
+
}
|
|
75
|
+
.connection-indicator.depends {
|
|
76
|
+
background: var(--info);
|
|
77
|
+
}
|
|
78
|
+
.connection-indicator.enhances {
|
|
79
|
+
background: var(--success);
|
|
80
|
+
}
|
|
81
|
+
.connection-indicator.conflicts {
|
|
82
|
+
background: var(--warning);
|
|
83
|
+
}
|
|
84
|
+
.connection-type .badge {
|
|
85
|
+
margin-left: auto;
|
|
86
|
+
background: var(--bg-tertiary);
|
|
87
|
+
color: var(--text-muted);
|
|
88
|
+
padding: 2px 8px;
|
|
89
|
+
border-radius: 12px;
|
|
90
|
+
font-size: 12px;
|
|
91
|
+
}
|
|
92
|
+
</style>
|
|
93
|
+
|
|
94
|
+
<?php layout_end(); ?>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
/**
|
|
3
|
+
* Workforce Page — Agent scheduling and workload management
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
layout_start('Workforce', 'workforce');
|
|
7
|
+
?>
|
|
8
|
+
|
|
9
|
+
<h2 class="title">Workforce</h2>
|
|
10
|
+
<p class="desc">Monitor agent schedules, workloads, and availability</p>
|
|
11
|
+
|
|
12
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; margin-bottom: 20px;">
|
|
13
|
+
<div class="stat-card">
|
|
14
|
+
<div class="stat-icon">🤖</div>
|
|
15
|
+
<div class="stat-value">0</div>
|
|
16
|
+
<div class="stat-label">Active Agents</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="stat-card">
|
|
19
|
+
<div class="stat-icon">⏳</div>
|
|
20
|
+
<div class="stat-value">0</div>
|
|
21
|
+
<div class="stat-label">Pending Tasks</div>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="stat-card">
|
|
24
|
+
<div class="stat-icon">📊</div>
|
|
25
|
+
<div class="stat-value">0%</div>
|
|
26
|
+
<div class="stat-label">Utilization</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="tabs">
|
|
31
|
+
<div class="tab active">Schedule</div>
|
|
32
|
+
<div class="tab">Workload</div>
|
|
33
|
+
<div class="tab">Analytics</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div class="card">
|
|
37
|
+
<div class="card-t">Agent Schedule</div>
|
|
38
|
+
<div class="empty">
|
|
39
|
+
<div class="empty-i">🕐</div>
|
|
40
|
+
<p>No scheduled tasks</p>
|
|
41
|
+
<small>Agent schedules and time allocations will appear here</small>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div style="display: grid; grid-template-columns: 2fr 1fr; gap: 20px; margin-top: 20px;">
|
|
46
|
+
<div class="card">
|
|
47
|
+
<div class="card-t">Workload Distribution</div>
|
|
48
|
+
<div class="empty">
|
|
49
|
+
<div class="empty-i">⚖️</div>
|
|
50
|
+
<p>No workload data</p>
|
|
51
|
+
<small>Agent workload distribution will appear here</small>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<div class="card">
|
|
56
|
+
<div class="card-t">Performance Metrics</div>
|
|
57
|
+
<div class="empty">
|
|
58
|
+
<div class="empty-i">📈</div>
|
|
59
|
+
<p>No metrics available</p>
|
|
60
|
+
<small>Performance analytics will appear here</small>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<style>
|
|
66
|
+
.stat-card {
|
|
67
|
+
background: var(--bg-card);
|
|
68
|
+
border: 1px solid var(--border);
|
|
69
|
+
border-radius: var(--radius);
|
|
70
|
+
padding: 20px;
|
|
71
|
+
text-align: center;
|
|
72
|
+
}
|
|
73
|
+
.stat-icon {
|
|
74
|
+
font-size: 24px;
|
|
75
|
+
margin-bottom: 8px;
|
|
76
|
+
}
|
|
77
|
+
.stat-value {
|
|
78
|
+
font-size: 24px;
|
|
79
|
+
font-weight: 700;
|
|
80
|
+
color: var(--accent-text);
|
|
81
|
+
margin-bottom: 4px;
|
|
82
|
+
}
|
|
83
|
+
.stat-label {
|
|
84
|
+
font-size: 13px;
|
|
85
|
+
color: var(--text-muted);
|
|
86
|
+
}
|
|
87
|
+
</style>
|
|
88
|
+
|
|
89
|
+
<?php layout_end(); ?>
|
|
@@ -1,81 +1,175 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* AgenticMail Enterprise Dashboard —
|
|
3
|
-
*
|
|
2
|
+
* AgenticMail Enterprise Dashboard — Professional Theme
|
|
3
|
+
* Updated to match main React dashboard styling
|
|
4
|
+
* Professional dark theme with indigo accents
|
|
4
5
|
*/
|
|
5
6
|
|
|
6
|
-
/*
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
/* ═══════════════════════════════════════════════════════════
|
|
8
|
+
THEME SYSTEM — CSS Custom Properties
|
|
9
|
+
═══════════════════════════════════════════════════════════ */
|
|
10
|
+
:root {
|
|
11
|
+
--bg-primary: #0f1117;
|
|
12
|
+
--bg-secondary: #161822;
|
|
13
|
+
--bg-tertiary: #1c1f2e;
|
|
14
|
+
--bg-hover: #232738;
|
|
15
|
+
--bg-active: #2a2f45;
|
|
16
|
+
--bg-card: #181b28;
|
|
17
|
+
--bg-input: #1c1f2e;
|
|
18
|
+
--bg-modal: rgba(0,0,0,0.7);
|
|
19
|
+
--border: #2a2f45;
|
|
20
|
+
--border-light: #353a52;
|
|
21
|
+
--text-primary: #e8eaf0;
|
|
22
|
+
--text-secondary: #9ca3b8;
|
|
23
|
+
--text-muted: #6b7394;
|
|
24
|
+
--text-inverse: #0f1117;
|
|
25
|
+
--accent: #6366f1;
|
|
26
|
+
--accent-hover: #4f46e5;
|
|
27
|
+
--accent-soft: rgba(99,102,241,0.12);
|
|
28
|
+
--accent-text: #818cf8;
|
|
29
|
+
--success: #22c55e;
|
|
30
|
+
--success-soft: rgba(34,197,94,0.12);
|
|
31
|
+
--warning: #f59e0b;
|
|
32
|
+
--warning-soft: rgba(245,158,11,0.12);
|
|
33
|
+
--danger: #ef4444;
|
|
34
|
+
--danger-soft: rgba(239,68,68,0.12);
|
|
35
|
+
--danger-hover: #dc2626;
|
|
36
|
+
--info: #06b6d4;
|
|
37
|
+
--info-soft: rgba(6,182,212,0.12);
|
|
38
|
+
--radius: 8px;
|
|
39
|
+
--radius-lg: 12px;
|
|
40
|
+
--radius-xl: 16px;
|
|
41
|
+
--shadow: 0 1px 3px rgba(0,0,0,0.3);
|
|
42
|
+
--shadow-lg: 0 4px 12px rgba(0,0,0,0.4);
|
|
43
|
+
--shadow-xl: 0 8px 24px rgba(0,0,0,0.5);
|
|
44
|
+
--font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
45
|
+
--font-mono: 'SF Mono', 'Fira Code', monospace;
|
|
46
|
+
--sidebar-w: 260px;
|
|
47
|
+
--sidebar-collapsed-w: 64px;
|
|
48
|
+
--sidebar-transition: width 200ms ease, box-shadow 200ms ease;
|
|
49
|
+
--header-h: 56px;
|
|
50
|
+
--transition: 150ms ease;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
[data-theme="light"] {
|
|
54
|
+
--bg-primary: #f8f9fb;
|
|
55
|
+
--bg-secondary: #ffffff;
|
|
56
|
+
--bg-tertiary: #f1f3f8;
|
|
57
|
+
--bg-hover: #e8ebf0;
|
|
58
|
+
--bg-active: #dde1ea;
|
|
59
|
+
--bg-card: #ffffff;
|
|
60
|
+
--bg-input: #f1f3f8;
|
|
61
|
+
--bg-modal: rgba(0,0,0,0.4);
|
|
62
|
+
--border: #e2e5ed;
|
|
63
|
+
--border-light: #eceef4;
|
|
64
|
+
--text-primary: #111827;
|
|
65
|
+
--text-secondary: #4b5563;
|
|
66
|
+
--text-muted: #9ca3af;
|
|
67
|
+
--text-inverse: #ffffff;
|
|
68
|
+
--shadow: 0 1px 3px rgba(0,0,0,0.08);
|
|
69
|
+
--shadow-lg: 0 4px 12px rgba(0,0,0,0.1);
|
|
70
|
+
--shadow-xl: 0 8px 24px rgba(0,0,0,0.12);
|
|
71
|
+
}
|
|
9
72
|
|
|
10
|
-
/*
|
|
11
|
-
|
|
73
|
+
/* ═══════════════════════════════════════════════════════════
|
|
74
|
+
RESET & BASE
|
|
75
|
+
═══════════════════════════════════════════════════════════ */
|
|
76
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
77
|
+
html { font-size: 14px; }
|
|
78
|
+
body { font-family: var(--font); background: var(--bg-primary); color: var(--text-primary); line-height: 1.5; -webkit-font-smoothing: antialiased; }
|
|
79
|
+
a { color: var(--accent-text); text-decoration: none; }
|
|
80
|
+
a:hover { text-decoration: underline; }
|
|
12
81
|
|
|
13
|
-
/*
|
|
82
|
+
/* ═══════════════════════════════════════════════════════════
|
|
83
|
+
LAYOUT
|
|
84
|
+
═══════════════════════════════════════════════════════════ */
|
|
14
85
|
.layout { display: flex; min-height: 100vh; }
|
|
15
86
|
|
|
16
|
-
/*
|
|
17
|
-
.sidebar { width:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
.sidebar-header
|
|
21
|
-
.
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
.nav
|
|
26
|
-
.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
.
|
|
30
|
-
|
|
31
|
-
.
|
|
32
|
-
|
|
33
|
-
/*
|
|
34
|
-
.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
.
|
|
41
|
-
.
|
|
42
|
-
|
|
43
|
-
/*
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
.btn {
|
|
51
|
-
.btn:hover { background:
|
|
52
|
-
.btn-
|
|
53
|
-
.btn-
|
|
54
|
-
.btn-
|
|
55
|
-
.btn-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
.
|
|
59
|
-
.
|
|
60
|
-
.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
.
|
|
66
|
-
|
|
67
|
-
.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
.
|
|
71
|
-
.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
87
|
+
/* Sidebar */
|
|
88
|
+
.sidebar { width: var(--sidebar-w); background: var(--bg-secondary); border-right: 1px solid var(--border); display: flex; flex-direction: column; position: fixed; top: 0; left: 0; bottom: 0; z-index: 50; }
|
|
89
|
+
|
|
90
|
+
/* Sidebar header */
|
|
91
|
+
.sidebar-header { padding: 16px; border-bottom: 1px solid var(--border); }
|
|
92
|
+
.sidebar-header h2 { font-size: 15px; font-weight: 700; }
|
|
93
|
+
.sidebar-header p { font-size: 11px; color: var(--text-muted); }
|
|
94
|
+
|
|
95
|
+
/* Navigation */
|
|
96
|
+
.nav { flex: 1; overflow-y: auto; padding: 8px; }
|
|
97
|
+
.nav-section { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); padding: 12px 12px 8px; margin-top: 16px; }
|
|
98
|
+
.nav-section:first-child { margin-top: 8px; }
|
|
99
|
+
.nav-item { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: var(--radius); color: var(--text-secondary); cursor: pointer; transition: all var(--transition); font-size: 13px; font-weight: 500; border: none; background: transparent; width: 100%; text-align: left; text-decoration: none; }
|
|
100
|
+
.nav-item:hover { background: var(--bg-hover); color: var(--text-primary); text-decoration: none; }
|
|
101
|
+
.nav-item.active { background: var(--accent-soft); color: var(--accent-text); }
|
|
102
|
+
.nav-item svg { width: 18px; height: 18px; flex-shrink: 0; }
|
|
103
|
+
|
|
104
|
+
/* Main content area */
|
|
105
|
+
.main-content { margin-left: var(--sidebar-w); width: calc(100% - var(--sidebar-w)); min-height: 100vh; display: flex; flex-direction: column; }
|
|
106
|
+
|
|
107
|
+
/* Topbar */
|
|
108
|
+
.topbar { height: var(--header-h); border-bottom: 1px solid var(--border); background: var(--bg-secondary); display: flex; align-items: center; justify-content: space-between; padding: 0 24px; }
|
|
109
|
+
.topbar-left { display: flex; align-items: center; gap: 16px; }
|
|
110
|
+
.topbar-title { font-size: 16px; font-weight: 600; }
|
|
111
|
+
.topbar-right { display: flex; align-items: center; gap: 8px; }
|
|
112
|
+
.page-content { flex: 1; padding: 24px; width: 100%; }
|
|
113
|
+
|
|
114
|
+
/* ═══════════════════════════════════════════════════════════
|
|
115
|
+
COMPONENTS
|
|
116
|
+
═══════════════════════════════════════════════════════════ */
|
|
117
|
+
.btn { display: inline-flex; align-items: center; gap: 5px; padding: 6px 12px; border-radius: var(--radius); font-size: 12px; font-weight: 500; border: 1px solid transparent; cursor: pointer; transition: all var(--transition); font-family: var(--font); line-height: 1.4; text-decoration: none; }
|
|
118
|
+
.btn:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
119
|
+
.btn-primary { background: var(--accent); color: white; }
|
|
120
|
+
.btn-primary:hover:not(:disabled) { background: var(--accent-hover); }
|
|
121
|
+
.btn-secondary { background: transparent; color: var(--text-secondary); border-color: var(--border); }
|
|
122
|
+
.btn-secondary:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-primary); border-color: var(--border-light); }
|
|
123
|
+
.btn-danger { background: var(--danger); color: white; }
|
|
124
|
+
.btn-danger:hover:not(:disabled) { background: var(--danger-hover); }
|
|
125
|
+
.btn-sm { padding: 3px 8px; font-size: 11px; }
|
|
126
|
+
.btn-lg { padding: 8px 16px; font-size: 13px; }
|
|
127
|
+
|
|
128
|
+
.card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; }
|
|
129
|
+
.card-header { padding: 16px 20px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; }
|
|
130
|
+
.card-header h3 { font-size: 14px; font-weight: 600; }
|
|
131
|
+
.card-body { padding: 20px; }
|
|
132
|
+
|
|
133
|
+
.input { width: 100%; padding: 8px 12px; background: var(--bg-input); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text-primary); font-size: 13px; font-family: var(--font); transition: border-color var(--transition); outline: none; }
|
|
134
|
+
.input:focus { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-soft); }
|
|
135
|
+
.input::placeholder { color: var(--text-muted); }
|
|
136
|
+
select.input { cursor: pointer; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M6 8L1 3h10z' fill='%239ca3b8'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 10px center; padding-right: 30px; }
|
|
137
|
+
|
|
138
|
+
.form-group { margin-bottom: 16px; }
|
|
139
|
+
.form-label { display: block; font-size: 12px; font-weight: 600; color: var(--text-secondary); margin-bottom: 6px; }
|
|
140
|
+
|
|
141
|
+
.badge { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; }
|
|
142
|
+
.badge-primary { background: var(--accent-soft); color: var(--accent-text); }
|
|
143
|
+
.badge-success { background: var(--success-soft); color: var(--success); }
|
|
144
|
+
.badge-warning { background: var(--warning-soft); color: var(--warning); }
|
|
145
|
+
.badge-danger { background: var(--danger-soft); color: var(--danger); }
|
|
146
|
+
|
|
147
|
+
table { width: 100%; border-collapse: collapse; }
|
|
148
|
+
thead th { text-align: left; padding: 10px 16px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); border-bottom: 1px solid var(--border); background: var(--bg-tertiary); }
|
|
149
|
+
tbody td { padding: 12px 16px; border-bottom: 1px solid var(--border); font-size: 13px; }
|
|
150
|
+
tbody tr:last-child td { border-bottom: none; }
|
|
151
|
+
tbody tr:hover { background: var(--bg-hover); }
|
|
152
|
+
|
|
153
|
+
.empty-state { text-align: center; padding: 48px 24px; }
|
|
154
|
+
.empty-state svg { width: 48px; height: 48px; color: var(--text-muted); margin-bottom: 16px; }
|
|
155
|
+
.empty-state h3 { font-size: 15px; font-weight: 600; margin-bottom: 4px; }
|
|
156
|
+
.empty-state p { color: var(--text-muted); font-size: 13px; margin-bottom: 16px; }
|
|
157
|
+
|
|
158
|
+
.stat-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 20px; }
|
|
159
|
+
.stat-label { font-size: 12px; color: var(--text-muted); font-weight: 500; }
|
|
160
|
+
.stat-value { font-size: 28px; font-weight: 700; margin-top: 4px; }
|
|
161
|
+
.stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; }
|
|
162
|
+
|
|
163
|
+
/* Login page */
|
|
164
|
+
.login-page { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: var(--bg-primary); }
|
|
165
|
+
.login-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-xl); padding: 40px; width: 400px; box-shadow: var(--shadow-xl); }
|
|
166
|
+
.login-logo { text-align: center; margin-bottom: 32px; }
|
|
167
|
+
.login-logo h1 { font-size: 22px; font-weight: 700; margin-top: 12px; }
|
|
168
|
+
.login-logo p { color: var(--text-muted); font-size: 13px; margin-top: 4px; }
|
|
169
|
+
|
|
170
|
+
/* Responsive */
|
|
171
|
+
@media (max-width: 768px) {
|
|
172
|
+
.sidebar { transform: translateX(-100%); width: var(--sidebar-w); }
|
|
173
|
+
.main-content { margin-left: 0; width: 100%; }
|
|
174
|
+
.stat-grid { grid-template-columns: 1fr; }
|
|
175
|
+
}
|
package/dashboards/python/app.py
CHANGED
|
@@ -34,6 +34,14 @@ from routes.messages import messages_bp
|
|
|
34
34
|
from routes.compliance import compliance_bp
|
|
35
35
|
from routes.vault import vault_bp
|
|
36
36
|
from routes.skills import skills_bp
|
|
37
|
+
from routes.activity import activity_bp
|
|
38
|
+
from routes.approvals import approvals_bp
|
|
39
|
+
from routes.community_skills import community_skills_bp
|
|
40
|
+
from routes.domain_status import domain_status_bp
|
|
41
|
+
from routes.knowledge import knowledge_bp
|
|
42
|
+
from routes.knowledge_contributions import knowledge_contributions_bp
|
|
43
|
+
from routes.skill_connections import skill_connections_bp
|
|
44
|
+
from routes.workforce import workforce_bp
|
|
37
45
|
|
|
38
46
|
|
|
39
47
|
def create_app():
|
|
@@ -55,6 +63,14 @@ def create_app():
|
|
|
55
63
|
app.register_blueprint(compliance_bp)
|
|
56
64
|
app.register_blueprint(vault_bp)
|
|
57
65
|
app.register_blueprint(skills_bp)
|
|
66
|
+
app.register_blueprint(activity_bp)
|
|
67
|
+
app.register_blueprint(approvals_bp)
|
|
68
|
+
app.register_blueprint(community_skills_bp)
|
|
69
|
+
app.register_blueprint(domain_status_bp)
|
|
70
|
+
app.register_blueprint(knowledge_bp)
|
|
71
|
+
app.register_blueprint(knowledge_contributions_bp)
|
|
72
|
+
app.register_blueprint(skill_connections_bp)
|
|
73
|
+
app.register_blueprint(workforce_bp)
|
|
58
74
|
|
|
59
75
|
# ─── Jinja2 Template Filters ──────────────────────────
|
|
60
76
|
app.jinja_env.filters['badge'] = badge
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Activity Routes — Shows recent agent activity and system events"""
|
|
2
|
+
|
|
3
|
+
from flask import Blueprint, render_template
|
|
4
|
+
from utils.auth import require_auth
|
|
5
|
+
|
|
6
|
+
activity_bp = Blueprint('activity_bp', __name__)
|
|
7
|
+
|
|
8
|
+
@activity_bp.route('/activity')
|
|
9
|
+
@require_auth
|
|
10
|
+
def activity():
|
|
11
|
+
return render_template('activity.html', active_page='activity')
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Approvals Routes — Pending approvals and approval history"""
|
|
2
|
+
|
|
3
|
+
from flask import Blueprint, render_template
|
|
4
|
+
from utils.auth import require_auth
|
|
5
|
+
|
|
6
|
+
approvals_bp = Blueprint('approvals_bp', __name__)
|
|
7
|
+
|
|
8
|
+
@approvals_bp.route('/approvals')
|
|
9
|
+
@require_auth
|
|
10
|
+
def approvals():
|
|
11
|
+
return render_template('approvals.html', active_page='approvals')
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Community Skills Routes — Browse and install community-contributed skills"""
|
|
2
|
+
|
|
3
|
+
from flask import Blueprint, render_template
|
|
4
|
+
from utils.auth import require_auth
|
|
5
|
+
|
|
6
|
+
community_skills_bp = Blueprint('community_skills_bp', __name__)
|
|
7
|
+
|
|
8
|
+
@community_skills_bp.route('/community-skills')
|
|
9
|
+
@require_auth
|
|
10
|
+
def community_skills():
|
|
11
|
+
return render_template('community-skills.html', active_page='community_skills')
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Domain Status Routes — Domain health and email security status"""
|
|
2
|
+
|
|
3
|
+
from flask import Blueprint, render_template
|
|
4
|
+
from utils.auth import require_auth
|
|
5
|
+
|
|
6
|
+
domain_status_bp = Blueprint('domain_status_bp', __name__)
|
|
7
|
+
|
|
8
|
+
@domain_status_bp.route('/domain-status')
|
|
9
|
+
@require_auth
|
|
10
|
+
def domain_status():
|
|
11
|
+
return render_template('domain-status.html', active_page='domain_status')
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Knowledge Routes — Knowledge base management"""
|
|
2
|
+
|
|
3
|
+
from flask import Blueprint, render_template
|
|
4
|
+
from utils.auth import require_auth
|
|
5
|
+
|
|
6
|
+
knowledge_bp = Blueprint('knowledge_bp', __name__)
|
|
7
|
+
|
|
8
|
+
@knowledge_bp.route('/knowledge')
|
|
9
|
+
@require_auth
|
|
10
|
+
def knowledge():
|
|
11
|
+
return render_template('knowledge.html', active_page='knowledge')
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Knowledge Contributions Routes — Community knowledge sharing hub"""
|
|
2
|
+
|
|
3
|
+
from flask import Blueprint, render_template
|
|
4
|
+
from utils.auth import require_auth
|
|
5
|
+
|
|
6
|
+
knowledge_contributions_bp = Blueprint('knowledge_contributions_bp', __name__)
|
|
7
|
+
|
|
8
|
+
@knowledge_contributions_bp.route('/knowledge-contributions')
|
|
9
|
+
@require_auth
|
|
10
|
+
def knowledge_contributions():
|
|
11
|
+
return render_template('knowledge-contributions.html', active_page='knowledge_contributions')
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Skill Connections Routes — Manage skill integrations and connections"""
|
|
2
|
+
|
|
3
|
+
from flask import Blueprint, render_template
|
|
4
|
+
from utils.auth import require_auth
|
|
5
|
+
|
|
6
|
+
skill_connections_bp = Blueprint('skill_connections_bp', __name__)
|
|
7
|
+
|
|
8
|
+
@skill_connections_bp.route('/skill-connections')
|
|
9
|
+
@require_auth
|
|
10
|
+
def skill_connections():
|
|
11
|
+
return render_template('skill-connections.html', active_page='skill_connections')
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Workforce Routes — Agent workforce management and scheduling"""
|
|
2
|
+
|
|
3
|
+
from flask import Blueprint, render_template
|
|
4
|
+
from utils.auth import require_auth
|
|
5
|
+
|
|
6
|
+
workforce_bp = Blueprint('workforce_bp', __name__)
|
|
7
|
+
|
|
8
|
+
@workforce_bp.route('/workforce')
|
|
9
|
+
@require_auth
|
|
10
|
+
def workforce():
|
|
11
|
+
return render_template('workforce.html', active_page='workforce')
|