Spaces:
Sleeping
Sleeping
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>Event Analysis Dashboard</title> | |
<!-- Bootstrap CSS --> | |
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> | |
<!-- Custom CSS --> | |
<style> | |
/* Dynamic Animations */ | |
@keyframes float { | |
0%, 100% { transform: translateY(0px); } | |
50% { transform: translateY(-10px); } | |
} | |
@keyframes glow { | |
0%, 100% { box-shadow: 0 0 20px rgba(147, 51, 234, 0.4); } | |
50% { box-shadow: 0 0 40px rgba(147, 51, 234, 0.8), 0 0 60px rgba(147, 51, 234, 0.4); } | |
} | |
@keyframes slideIn { | |
0% { transform: translateX(-100%); opacity: 0; } | |
100% { transform: translateX(0); opacity: 1; } | |
} | |
@keyframes pulse { | |
0% { transform: scale(1); } | |
50% { transform: scale(1.05); } | |
100% { transform: scale(1); } | |
} | |
@keyframes shimmer { | |
0% { background-position: -200% 0; } | |
100% { background-position: 200% 0; } | |
} | |
@keyframes rotate { | |
0% { transform: rotate(0deg); } | |
100% { transform: rotate(360deg); } | |
} | |
/* Base Styles */ | |
* { | |
margin: 0; | |
padding: 0; | |
box-sizing: border-box; | |
} | |
body { | |
background: linear-gradient(135deg, #667eea 0%, #764ba2 25%, #f093fb 50%, #f5576c 75%, #4facfe 100%); | |
background-size: 400% 400%; | |
animation: gradientShift 15s ease infinite; | |
font-family: 'Arial', sans-serif; | |
padding-top: 2rem; | |
min-height: 100vh; | |
position: relative; | |
overflow-x: hidden; | |
} | |
@keyframes gradientShift { | |
0% { background-position: 0% 50%; } | |
50% { background-position: 100% 50%; } | |
100% { background-position: 0% 50%; } | |
} | |
/* Floating particles background */ | |
body::before { | |
content: ''; | |
position: fixed; | |
top: 0; | |
left: 0; | |
width: 100%; | |
height: 100%; | |
background: | |
radial-gradient(circle at 20% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), | |
radial-gradient(circle at 80% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), | |
radial-gradient(circle at 40% 60%, rgba(255, 255, 255, 0.05) 0%, transparent 50%); | |
animation: float 8s ease-in-out infinite; | |
pointer-events: none; | |
z-index: -1; | |
} | |
/* Chart Container */ | |
.chart-container { | |
background: rgba(255, 255, 255, 0.95); | |
backdrop-filter: blur(20px); | |
border-radius: 20px; | |
border: 2px solid rgba(255, 255, 255, 0.3); | |
box-shadow: | |
0 20px 40px rgba(0, 0, 0, 0.1), | |
0 10px 20px rgba(0, 0, 0, 0.05), | |
inset 0 1px 0 rgba(255, 255, 255, 0.8); | |
padding: 30px; | |
margin-bottom: 30px; | |
position: relative; | |
overflow: hidden; | |
animation: slideIn 0.8s ease-out; | |
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); | |
} | |
.chart-container::before { | |
content: ''; | |
position: absolute; | |
top: 0; | |
left: -100%; | |
width: 100%; | |
height: 100%; | |
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); | |
animation: shimmer 3s infinite; | |
} | |
.chart-container:hover { | |
transform: translateY(-10px) scale(1.02); | |
box-shadow: | |
0 30px 60px rgba(0, 0, 0, 0.15), | |
0 15px 30px rgba(0, 0, 0, 0.1), | |
inset 0 1px 0 rgba(255, 255, 255, 0.9); | |
} | |
/* Stats Card */ | |
.stats-card { | |
height: 100%; | |
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%); | |
color: white; | |
border-radius: 15px; | |
padding: 20px; | |
position: relative; | |
overflow: hidden; | |
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); | |
animation: pulse 3s ease-in-out infinite; | |
} | |
.stats-card::before { | |
content: ''; | |
position: absolute; | |
top: -50%; | |
left: -50%; | |
width: 200%; | |
height: 200%; | |
background: radial-gradient(circle, rgba(255, 255, 255, 0.1) 0%, transparent 70%); | |
animation: rotate 10s linear infinite; | |
} | |
.stats-card:hover { | |
transform: translateY(-15px) rotate(2deg); | |
box-shadow: | |
0 25px 50px rgba(238, 90, 36, 0.4), | |
0 12px 24px rgba(238, 90, 36, 0.2); | |
animation: glow 2s ease-in-out infinite; | |
} | |
.stats-card:nth-child(even) { | |
background: linear-gradient(135deg, #4ecdc4 0%, #44a08d 100%); | |
} | |
.stats-card:nth-child(3n) { | |
background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%); | |
color: #333; | |
} | |
/* Upload Section */ | |
.upload-section { | |
background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%); | |
background-size: 300% 300%; | |
animation: gradientShift 8s ease infinite; | |
color: white; | |
padding: 4rem 0; | |
margin-bottom: 2rem; | |
position: relative; | |
overflow: hidden; | |
} | |
.upload-section::before { | |
content: ''; | |
position: absolute; | |
top: 0; | |
left: 0; | |
right: 0; | |
bottom: 0; | |
background: | |
radial-gradient(circle at 25% 25%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), | |
radial-gradient(circle at 75% 75%, rgba(255, 255, 255, 0.1) 0%, transparent 50%); | |
animation: float 6s ease-in-out infinite reverse; | |
} | |
/* Drop Zone */ | |
.drop-zone { | |
border: 3px dashed rgba(255, 255, 255, 0.6); | |
border-radius: 20px; | |
padding: 3rem; | |
text-align: center; | |
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); | |
background: rgba(255, 255, 255, 0.1); | |
backdrop-filter: blur(10px); | |
cursor: pointer; | |
position: relative; | |
overflow: hidden; | |
animation: pulse 4s ease-in-out infinite; | |
} | |
.drop-zone::before { | |
content: ''; | |
position: absolute; | |
top: 0; | |
left: 0; | |
right: 0; | |
bottom: 0; | |
background: linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.1) 50%, transparent 70%); | |
transform: translateX(-100%); | |
transition: transform 0.6s ease; | |
} | |
.drop-zone:hover::before { | |
transform: translateX(100%); | |
} | |
.drop-zone:hover { | |
transform: scale(1.05); | |
background: rgba(255, 255, 255, 0.2); | |
border-color: rgba(255, 255, 255, 0.9); | |
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2); | |
} | |
.drop-zone.dragover { | |
background: rgba(255, 255, 255, 0.3); | |
border-color: #fff; | |
transform: scale(1.1); | |
animation: glow 1s ease-in-out infinite; | |
} | |
.drop-zone-content { | |
color: white; | |
position: relative; | |
z-index: 2; | |
font-weight: 600; | |
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); | |
} | |
.upload-icon { | |
width: 60px; | |
height: 60px; | |
filter: invert(1) drop-shadow(0 4px 8px rgba(0, 0, 0, 0.3)); | |
animation: float 3s ease-in-out infinite; | |
margin-bottom: 1rem; | |
} | |
.selected-file { | |
margin-top: 1rem; | |
color: #fff; | |
font-weight: bold; | |
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); | |
animation: slideIn 0.5s ease-out; | |
} | |
/* Print Button */ | |
.print-btn { | |
position: fixed; | |
bottom: 30px; | |
right: 30px; | |
z-index: 1000; | |
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 50%, #ff9ff3 100%); | |
background-size: 200% 200%; | |
animation: gradientShift 3s ease infinite; | |
color: white; | |
border: none; | |
padding: 15px 30px; | |
border-radius: 50px; | |
box-shadow: | |
0 10px 30px rgba(238, 90, 36, 0.4), | |
0 5px 15px rgba(238, 90, 36, 0.2); | |
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); | |
font-weight: 600; | |
font-size: 16px; | |
text-transform: uppercase; | |
letter-spacing: 1px; | |
cursor: pointer; | |
position: relative; | |
overflow: hidden; | |
} | |
.print-btn::before { | |
content: ''; | |
position: absolute; | |
top: 0; | |
left: -100%; | |
width: 100%; | |
height: 100%; | |
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); | |
transition: left 0.5s ease; | |
} | |
.print-btn:hover::before { | |
left: 100%; | |
} | |
.print-btn:hover { | |
transform: translateY(-5px) scale(1.05); | |
box-shadow: | |
0 20px 50px rgba(238, 90, 36, 0.5), | |
0 10px 25px rgba(238, 90, 36, 0.3); | |
animation: glow 2s ease-in-out infinite; | |
} | |
.print-btn:active { | |
transform: translateY(-2px) scale(0.98); | |
} | |
/* Additional Enhancements */ | |
.neon-text { | |
color: #fff; | |
text-shadow: | |
0 0 5px currentColor, | |
0 0 10px currentColor, | |
0 0 15px currentColor, | |
0 0 20px #ff6b6b, | |
0 0 35px #ff6b6b, | |
0 0 40px #ff6b6b; | |
animation: pulse 2s ease-in-out infinite alternate; | |
} | |
.glass-effect { | |
background: rgba(255, 255, 255, 0.25); | |
backdrop-filter: blur(20px); | |
border: 1px solid rgba(255, 255, 255, 0.18); | |
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); | |
} | |
/* Mobile Responsiveness */ | |
@media (max-width: 768px) { | |
.chart-container { | |
padding: 20px; | |
margin-bottom: 20px; | |
} | |
.upload-section { | |
padding: 2rem 0; | |
} | |
.drop-zone { | |
padding: 2rem; | |
} | |
.print-btn { | |
bottom: 20px; | |
right: 20px; | |
padding: 12px 24px; | |
} | |
} | |
/* Demo Content */ | |
.demo-content { | |
max-width: 1200px; | |
margin: 0 auto; | |
padding: 20px; | |
} | |
.demo-grid { | |
display: grid; | |
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); | |
gap: 20px; | |
margin-top: 20px; | |
} | |
.demo-title { | |
text-align: center; | |
font-size: 2.5rem; | |
font-weight: bold; | |
margin-bottom: 2rem; | |
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
-webkit-background-clip: text; | |
-webkit-text-fill-color: transparent; | |
background-clip: text; | |
} | |
</style> | |
</head> | |
<body> | |
<!-- Header Section --> | |
<div class="upload-section"> | |
<div class="container"> | |
<h1 class="text-center mb-4">Event Analysis Dashboard</h1> | |
<div class="row justify-content-center"> | |
<div class="col-md-6"> | |
<form method="POST" enctype="multipart/form-data" class="text-center"> | |
<div class="mb-3"> | |
<div class="drop-zone" id="dropZone"> | |
<div class="drop-zone-content"> | |
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ij48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz0iMTcgOCAxMiAzIDcgOCI+PC9wb2x5bGluZT48bGluZSB4MT0iMTIiIHkxPSIzIiB4Mj0iMTIiIHkyPSIxNSI+PC9saW5lPjwvc3ZnPg==" alt="Upload icon" class="upload-icon mb-2"> | |
<p class="mb-0">Drag & drop your DOCX file here</p> | |
<p class="text-muted">or</p> | |
<label for="document" class="btn btn-light">Browse Files</label> | |
</div> | |
<input type="file" class="form-control d-none" id="document" name="document" accept=".docx"> | |
</div> | |
</div> | |
<button type="submit" class="btn btn-light" id="submitBtn" disabled>Analyze Document</button> | |
</form> | |
{% if error %} | |
<div class="alert alert-danger mt-3" role="alert"> | |
{{ error }} | |
</div> | |
{% endif %} | |
</div> | |
</div> | |
</div> | |
</div> | |
{% if plots %} | |
<div class="container"> | |
<!-- Statistics Cards --> | |
<div class="row mb-4"> | |
<div class="col-md-3"> | |
<div class="card stats-card"> | |
<div class="card-body"> | |
<h5 class="card-title">Total Events</h5> | |
<p class="card-text display-6">{{ plots.stats.total_events }}</p> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-3"> | |
<div class="card stats-card"> | |
<div class="card-body"> | |
<h5 class="card-title">Avg Events/Year</h5> | |
<p class="card-text display-6">{{ plots.stats.avg_events_per_year }}</p> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-3"> | |
<div class="card stats-card"> | |
<div class="card-body"> | |
<h5 class="card-title">Most Active Year</h5> | |
<p class="card-text display-6">{{ plots.stats.most_active_year }}</p> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-3"> | |
<div class="card stats-card"> | |
<div class="card-body"> | |
<h5 class="card-title">Top Category</h5> | |
<p class="card-text display-6">{{ plots.stats.most_common_category }}</p> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- Charts Section --> | |
<div class="row"> | |
<!-- Bar Chart --> | |
<div class="col-md-6 mb-4"> | |
<div class="chart-container"> | |
<h3 class="text-center mb-3">Events Distribution</h3> | |
{{ plots.bar.plot|safe }} | |
<div class="mt-4"> | |
<h5>Key Insight:</h5> | |
<p>{{ plots.bar.insight.main_insight }}</p> | |
<h5>SWOT Analysis:</h5> | |
<div class="row"> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-success text-white"> | |
<h6 class="mb-0">Strengths</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for strength in plots.bar.insight.swot.strengths %} | |
<li>• {{ strength }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-danger text-white"> | |
<h6 class="mb-0">Weaknesses</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for weakness in plots.bar.insight.swot.weaknesses %} | |
<li>• {{ weakness }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-primary text-white"> | |
<h6 class="mb-0">Opportunities</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for opportunity in plots.bar.insight.swot.opportunities %} | |
<li>• {{ opportunity }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-warning"> | |
<h6 class="mb-0">Threats</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for threat in plots.bar.insight.swot.threats %} | |
<li>• {{ threat }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div> | |
<h5>Recommendations:</h5> | |
<ul> | |
{% for recommendation in plots.bar.insight.recommendations %} | |
<li>{{ recommendation }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<!-- Pie Chart --> | |
<div class="col-md-6 mb-4"> | |
<div class="chart-container"> | |
<h3 class="text-center mb-3">Current Year Distribution</h3> | |
{{ plots.pie.plot|safe }} | |
<div class="mt-4"> | |
<h5>Key Insight:</h5> | |
<p>{{ plots.pie.insight.main_insight }}</p> | |
<h5>SWOT Analysis:</h5> | |
<div class="row"> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-success text-white"> | |
<h6 class="mb-0">Strengths</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for strength in plots.pie.insight.swot.strengths %} | |
<li>• {{ strength }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-danger text-white"> | |
<h6 class="mb-0">Weaknesses</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for weakness in plots.pie.insight.swot.weaknesses %} | |
<li>• {{ weakness }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-primary text-white"> | |
<h6 class="mb-0">Opportunities</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for opportunity in plots.pie.insight.swot.opportunities %} | |
<li>• {{ opportunity }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-warning"> | |
<h6 class="mb-0">Threats</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for threat in plots.pie.insight.swot.threats %} | |
<li>• {{ threat }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div> | |
<h5>Recommendations:</h5> | |
<ul> | |
{% for recommendation in plots.pie.insight.recommendations %} | |
<li>{{ recommendation }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<!-- Line Chart --> | |
<div class="col-md-6 mb-4"> | |
<div class="chart-container"> | |
<h3 class="text-center mb-3">Event Trends</h3> | |
{{ plots.line.plot|safe }} | |
<div class="mt-4"> | |
<h5>Key Insight:</h5> | |
<p>{{ plots.line.insight.main_insight }}</p> | |
<h5>SWOT Analysis:</h5> | |
<div class="row"> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-success text-white"> | |
<h6 class="mb-0">Strengths</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for strength in plots.line.insight.swot.strengths %} | |
<li>• {{ strength }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-danger text-white"> | |
<h6 class="mb-0">Weaknesses</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for weakness in plots.line.insight.swot.weaknesses %} | |
<li>• {{ weakness }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-primary text-white"> | |
<h6 class="mb-0">Opportunities</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for opportunity in plots.line.insight.swot.opportunities %} | |
<li>• {{ opportunity }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-warning"> | |
<h6 class="mb-0">Threats</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for threat in plots.line.insight.swot.threats %} | |
<li>• {{ threat }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div> | |
<h5>Recommendations:</h5> | |
<ul> | |
{% for recommendation in plots.line.insight.recommendations %} | |
<li>{{ recommendation }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<!-- Growth Rate Chart --> | |
<div class="col-md-6 mb-4"> | |
<div class="chart-container"> | |
<h3 class="text-center mb-3">Year-over-Year Growth</h3> | |
{{ plots.growth.plot|safe }} | |
<div class="mt-4"> | |
<h5>Key Insight:</h5> | |
<p>{{ plots.growth.insight.main_insight }}</p> | |
<h5>SWOT Analysis:</h5> | |
<div class="row"> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-success text-white"> | |
<h6 class="mb-0">Strengths</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for strength in plots.growth.insight.swot.strengths %} | |
<li>• {{ strength }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-danger text-white"> | |
<h6 class="mb-0">Weaknesses</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for weakness in plots.growth.insight.swot.weaknesses %} | |
<li>• {{ weakness }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-primary text-white"> | |
<h6 class="mb-0">Opportunities</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for opportunity in plots.growth.insight.swot.opportunities %} | |
<li>• {{ opportunity }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-warning"> | |
<h6 class="mb-0">Threats</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for threat in plots.growth.insight.swot.threats %} | |
<li>• {{ threat }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div> | |
<h5>Recommendations:</h5> | |
<ul> | |
{% for recommendation in plots.growth.insight.recommendations %} | |
<li>{{ recommendation }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<!-- Area Chart --> | |
<div class="col-md-12 mb-4"> | |
<div class="chart-container"> | |
<h3 class="text-center mb-3">Cumulative Events</h3> | |
{{ plots.area.plot|safe }} | |
<div class="mt-4"> | |
<h5>Key Insight:</h5> | |
<p>{{ plots.area.insight.main_insight }}</p> | |
<h5>SWOT Analysis:</h5> | |
<div class="row"> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-success text-white"> | |
<h6 class="mb-0">Strengths</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for strength in plots.area.insight.swot.strengths %} | |
<li>• {{ strength }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-danger text-white"> | |
<h6 class="mb-0">Weaknesses</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for weakness in plots.area.insight.swot.weaknesses %} | |
<li>• {{ weakness }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-primary text-white"> | |
<h6 class="mb-0">Opportunities</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for opportunity in plots.area.insight.swot.opportunities %} | |
<li>• {{ opportunity }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-6"> | |
<div class="card mb-3"> | |
<div class="card-header bg-warning"> | |
<h6 class="mb-0">Threats</h6> | |
</div> | |
<div class="card-body"> | |
<ul class="list-unstyled mb-0"> | |
{% for threat in plots.area.insight.swot.threats %} | |
<li>• {{ threat }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div> | |
<h5>Recommendations:</h5> | |
<ul> | |
{% for recommendation in plots.area.insight.recommendations %} | |
<li>{{ recommendation }}</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- Growth Analysis Section --> | |
<div class="row mb-4"> | |
<div class="col-12"> | |
<div class="card"> | |
<div class="card-body"> | |
<h3 class="card-title">Growth Analysis</h3> | |
<p class="card-text">Total Growth: {{ plots.stats.growth_analysis.total_growth }}%</p> | |
<h5>Category-wise Growth:</h5> | |
<ul class="list-group"> | |
{% for category, growth in plots.stats.growth_analysis.category_growth.items() %} | |
<li class="list-group-item d-flex justify-content-between align-items-center"> | |
{{ category }} | |
<span class="badge bg-{{ 'success' if growth > 0 else 'danger' }} rounded-pill"> | |
{{ growth }}% | |
</span> | |
</li> | |
{% endfor %} | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
{% endif %} | |
<button class="btn btn-primary print-btn" id="printPageBtn">Print Page</button> | |
<!-- Bootstrap JS and Popper.js --> | |
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> | |
<script> | |
document.addEventListener('DOMContentLoaded', function() { | |
document.getElementById('printPageBtn').addEventListener('click', function() { | |
window.print(); | |
}); | |
}); | |
document.addEventListener('DOMContentLoaded', function() { | |
const dropZone = document.getElementById('dropZone'); | |
const fileInput = document.getElementById('document'); | |
const submitBtn = document.getElementById('submitBtn'); | |
// Prevent default drag behaviors | |
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { | |
dropZone.addEventListener(eventName, preventDefaults, false); | |
document.body.addEventListener(eventName, preventDefaults, false); | |
}); | |
// Highlight drop zone when dragging over it | |
['dragenter', 'dragover'].forEach(eventName => { | |
dropZone.addEventListener(eventName, highlight, false); | |
}); | |
['dragleave', 'drop'].forEach(eventName => { | |
dropZone.addEventListener(eventName, unhighlight, false); | |
}); | |
// Handle dropped files | |
dropZone.addEventListener('drop', handleDrop, false); | |
// Handle clicked files | |
fileInput.addEventListener('change', handleFiles, false); | |
// Click handling for the drop zone | |
dropZone.addEventListener('click', (e) => { | |
// Prevent click if clicking on the Browse Files button | |
if (e.target.tagName === 'LABEL') { | |
return; | |
} | |
fileInput.click(); | |
}); | |
function preventDefaults(e) { | |
e.preventDefault(); | |
e.stopPropagation(); | |
} | |
function highlight(e) { | |
dropZone.classList.add('dragover'); | |
} | |
function unhighlight(e) { | |
dropZone.classList.remove('dragover'); | |
} | |
function handleDrop(e) { | |
const dt = e.dataTransfer; | |
const files = dt.files; | |
if (files.length) { | |
fileInput.files = files; // Set the files to the input | |
handleFiles(files[0]); | |
} | |
} | |
function handleFiles(e) { | |
const file = e.target ? e.target.files[0] : e; // Handle both event and direct file | |
if (file) { | |
if (file.name.endsWith('.docx')) { | |
updateDropZoneContent(file.name); | |
submitBtn.disabled = false; | |
} else { | |
alert('Please upload a .docx file'); | |
fileInput.value = ''; | |
submitBtn.disabled = true; | |
resetDropZoneContent(); | |
} | |
} | |
} | |
function updateDropZoneContent(fileName) { | |
const content = dropZone.querySelector('.drop-zone-content'); | |
content.innerHTML = ` | |
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgdmlld0JveG0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ij48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz0iMTcgOCAxMiAzIDcgOCI+PC9wb2x5bGluZT48bGluZSB4MT0iMTIiIHkxPSIzIiB4Mj0iMTIiIHkyPSIxNSI+PC9saW5lPjwvc3ZnPg==" alt="Upload icon" class="upload-icon mb-2"> | |
<p class="selected-file">${fileName}</p> | |
<p class="text-muted">Click or drag to change file</p> | |
`; | |
} | |
function resetDropZoneContent() { | |
const content = dropZone.querySelector('.drop-zone-content'); | |
content.innerHTML = ` | |
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00Ij48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz0iMTcgOCAxMiAzIDcgOCI+PC9wb2x5bGluZT48bGluZSB4MT0iMTIiIHkxPSIzIiB4Mj0iMTIiIHkyPSIxNSI+PC9saW5lPjwvc3ZnPg==" alt="Upload icon" class="upload-icon mb-2"> | |
<p class="mb-0">Drag & drop your DOCX file here</p> | |
<p class="text-muted">or</p> | |
<label for="document" class="btn btn-light">Browse Files</label> | |
`; | |
} | |
}); | |
</script> | |
</body> | |
</html> |