pranit144's picture
Upload 3 files
7741de0 verified
<!DOCTYPE html>
<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>