feat: Redesign admin import interface with proper styling and navigation

IMPROVEMENTS:
 Template now extends base.html for consistent navigation and styling
 Proper dark mode support with neutral/primary color schemes
 Professional card-based layout with rounded corners and shadows
 Consistent button styling with icons and hover states
 Responsive design with proper spacing and typography
 Integrated with main navigation menu and user dropdown
 Back to Admin button with proper styling

FEATURES:
- Single file import with table selection and validation
- Schema information display with proper styling
- Real-time progress tracking with scrollable log
- Comprehensive results display with metrics cards
- Batch import functionality with file management
- All styled consistently with the rest of the application

BEFORE: Basic unstyled HTML page without navigation
AFTER: Fully integrated admin interface matching application design

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
HotSwapp
2025-09-21 21:07:21 -05:00
parent f0eecdf83e
commit 830ddcc4d1

View File

@@ -1,57 +1,44 @@
<!DOCTYPE html> {% extends "base.html" %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
<link href="/static/css/output.css" rel="stylesheet">
<script src="/static/js/http.js"></script>
<script src="/static/js/alerts.js"></script>
<script src="/static/js/main.js"></script>
</head>
<body class="bg-gray-100">
<div id="main-container" class="min-h-screen">
<!-- Navigation -->
<nav class="bg-blue-600 text-white shadow-lg">
<div class="max-w-7xl mx-auto px-4">
<div class="flex justify-between h-16">
<div class="flex items-center">
<h1 class="text-xl font-bold">Data Import</h1>
</div>
<div class="flex items-center space-x-4">
<a href="/admin" class="hover:text-blue-200">← Back to Admin</a>
<div id="userDropdown" class="relative">
<button class="flex items-center space-x-2 hover:text-blue-200">
<span>Loading...</span>
</button>
</div>
</div>
</div>
</div>
</nav>
<!-- Main Content --> {% block title %}CSV Import - Delphi Database{% endblock %}
<div class="max-w-4xl mx-auto py-8 px-4">
{% block bridge_css %}{% endblock %}
{% block content %}
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
<!-- Page Header --> <!-- Page Header -->
<div class="mb-8"> <div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-8">
<h2 class="text-3xl font-bold text-gray-900 mb-4">CSV Data Import</h2> <div class="flex items-center gap-3">
<p class="text-gray-600"> <div class="flex items-center justify-center w-12 h-12 bg-primary-100 dark:bg-primary-800 text-primary-600 dark:text-primary-400 rounded-xl">
Import CSV files converted from legacy .sc files into the database. <i class="fa-solid fa-cloud-arrow-up text-xl"></i>
Please ensure your CSV files follow the correct format for each table. </div>
</p> <div>
<h1 class="text-3xl font-bold text-neutral-900 dark:text-neutral-100">CSV Data Import</h1>
<p class="text-neutral-600 dark:text-neutral-400">Import CSV files converted from legacy .sc files into the database</p>
</div>
</div>
<div class="flex items-center gap-2">
<a href="/admin" class="inline-flex items-center gap-2 px-4 py-2 bg-neutral-100 dark:bg-neutral-800 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors duration-200">
<i class="fa-solid fa-arrow-left text-sm"></i>
<span>Back to Admin</span>
</a>
</div>
</div> </div>
<!-- Import Form --> <!-- Import Form -->
<div class="bg-white rounded-lg shadow-md p-6 mb-8"> <div class="bg-white dark:bg-neutral-800 rounded-xl shadow-lg border border-neutral-200 dark:border-neutral-700 p-6 mb-8">
<h3 class="text-xl font-semibold mb-4">Single File Import</h3> <h2 class="text-xl font-semibold text-neutral-900 dark:text-neutral-100 mb-4 flex items-center gap-2">
<i class="fa-solid fa-file-arrow-up text-primary-600"></i>
Single File Import
</h2>
<form id="importForm" class="space-y-4"> <form id="importForm" class="space-y-6">
<div> <div>
<label for="tableSelect" class="block text-sm font-medium text-gray-700 mb-2"> <label for="tableSelect" class="block text-sm font-medium text-neutral-700 dark:text-neutral-300 mb-2">
Select Table Type Select Table Type
</label> </label>
<select id="tableSelect" name="table_name" <select id="tableSelect" name="table_name"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"> class="w-full px-4 py-3 border border-neutral-300 dark:border-neutral-600 rounded-lg bg-white dark:bg-neutral-700 text-neutral-900 dark:text-neutral-100 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent">
<option value="">-- Select Table --</option> <option value="">-- Select Table --</option>
<option value="rolodex">ROLODEX (Contacts)</option> <option value="rolodex">ROLODEX (Contacts)</option>
<option value="phone">PHONE (Phone Numbers)</option> <option value="phone">PHONE (Phone Numbers)</option>
@@ -62,72 +49,86 @@
</div> </div>
<div> <div>
<label for="csvFile" class="block text-sm font-medium text-gray-700 mb-2"> <label for="csvFile" class="block text-sm font-medium text-neutral-700 dark:text-neutral-300 mb-2">
Select CSV File Select CSV File
</label> </label>
<input type="file" id="csvFile" name="file" accept=".csv" <input type="file" id="csvFile" name="file" accept=".csv"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"> class="w-full px-4 py-3 border border-neutral-300 dark:border-neutral-600 rounded-lg bg-white dark:bg-neutral-700 text-neutral-900 dark:text-neutral-100 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent file:mr-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:bg-primary-50 file:text-primary-700 file:hover:bg-primary-100">
<p class="text-sm text-gray-500 mt-1">Only CSV files are supported. Max file size: 100MB</p> <p class="text-sm text-neutral-500 dark:text-neutral-400 mt-2">Only CSV files are supported. Max file size: 100MB</p>
</div> </div>
<div class="flex space-x-4"> <div class="flex space-x-4">
<button type="button" id="validateBtn" <button type="button" id="validateBtn"
class="px-4 py-2 bg-yellow-600 text-white rounded-md hover:bg-yellow-700 focus:outline-none focus:ring-2 focus:ring-yellow-500 disabled:opacity-50"> class="px-6 py-3 bg-warning-600 text-white rounded-lg hover:bg-warning-700 focus:outline-none focus:ring-2 focus:ring-warning-500 disabled:opacity-50 transition-colors duration-200 flex items-center gap-2">
Validate Headers <i class="fa-solid fa-check-circle"></i>
<span>Validate Headers</span>
</button> </button>
<button type="submit" id="importBtn" <button type="submit" id="importBtn"
class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:opacity-50"> class="px-6 py-3 bg-primary-600 text-white rounded-lg hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-primary-500 disabled:opacity-50 transition-colors duration-200 flex items-center gap-2">
Import Data <i class="fa-solid fa-upload"></i>
<span>Import Data</span>
</button> </button>
</div> </div>
</form> </form>
</div> </div>
<!-- Schema Information --> <!-- Schema Information -->
<div id="schemaInfo" class="bg-blue-50 rounded-lg p-6 mb-8 hidden"> <div id="schemaInfo" class="bg-primary-50 dark:bg-primary-900/20 border border-primary-200 dark:border-primary-800 rounded-xl p-6 mb-8 hidden">
<h3 class="text-lg font-semibold text-blue-900 mb-3">Required Columns</h3> <h3 class="text-lg font-semibold text-primary-900 dark:text-primary-100 mb-3 flex items-center gap-2">
<div id="schemaDetails" class="text-sm text-blue-800"></div> <i class="fa-solid fa-table-columns"></i>
Required Columns
</h3>
<div id="schemaDetails" class="text-sm text-primary-800 dark:text-primary-200"></div>
</div> </div>
<!-- Import Progress --> <!-- Import Progress -->
<div id="importProgress" class="bg-white rounded-lg shadow-md p-6 mb-8 hidden"> <div id="importProgress" class="bg-white dark:bg-neutral-800 rounded-xl shadow-lg border border-neutral-200 dark:border-neutral-700 p-6 mb-8 hidden">
<h3 class="text-xl font-semibold mb-4">Import Progress</h3> <h3 class="text-xl font-semibold text-neutral-900 dark:text-neutral-100 mb-4 flex items-center gap-2">
<div id="progressDetails"></div> <i class="fa-solid fa-spinner fa-spin text-primary-600"></i>
Import Progress
</h3>
<div id="progressDetails" class="space-y-2 max-h-64 overflow-y-auto"></div>
</div> </div>
<!-- Import Results --> <!-- Import Results -->
<div id="importResults" class="bg-white rounded-lg shadow-md p-6 hidden"> <div id="importResults" class="bg-white dark:bg-neutral-800 rounded-xl shadow-lg border border-neutral-200 dark:border-neutral-700 p-6 mb-8 hidden">
<h3 class="text-xl font-semibold mb-4">Import Results</h3> <h3 class="text-xl font-semibold text-neutral-900 dark:text-neutral-100 mb-4 flex items-center gap-2">
<i class="fa-solid fa-chart-line text-success-600"></i>
Import Results
</h3>
<div id="resultsContent"></div> <div id="resultsContent"></div>
</div> </div>
<!-- Batch Import Section --> <!-- Batch Import Section -->
<div class="bg-white rounded-lg shadow-md p-6"> <div class="bg-white dark:bg-neutral-800 rounded-xl shadow-lg border border-neutral-200 dark:border-neutral-700 p-6">
<h3 class="text-xl font-semibold mb-4">Batch Import (Multiple Files)</h3> <h2 class="text-xl font-semibold text-neutral-900 dark:text-neutral-100 mb-4 flex items-center gap-2">
<p class="text-gray-600 mb-4"> <i class="fa-solid fa-layer-group text-primary-600"></i>
Batch Import (Multiple Files)
</h2>
<p class="text-neutral-600 dark:text-neutral-400 mb-6">
Import multiple CSV files at once. Files will be processed in dependency order Import multiple CSV files at once. Files will be processed in dependency order
(ROLODEX → PHONE/FILES → LEDGER/QDROS). (ROLODEX → PHONE/FILES → LEDGER/QDROS).
</p> </p>
<div id="batchFiles" class="space-y-3"> <div id="batchFiles" class="space-y-4 mb-6">
<!-- Batch file inputs will be added here --> <!-- Batch file inputs will be added here -->
</div> </div>
<div class="flex space-x-4 mt-4"> <div class="flex space-x-4">
<button type="button" id="addBatchFile" <button type="button" id="addBatchFile"
class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-500"> class="px-6 py-3 bg-success-600 text-white rounded-lg hover:bg-success-700 focus:outline-none focus:ring-2 focus:ring-success-500 transition-colors duration-200 flex items-center gap-2">
Add File <i class="fa-solid fa-plus"></i>
<span>Add File</span>
</button> </button>
<button type="button" id="batchImportBtn" <button type="button" id="batchImportBtn"
class="px-4 py-2 bg-purple-600 text-white rounded-md hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-purple-500 disabled:opacity-50"> class="px-6 py-3 bg-purple-600 text-white rounded-lg hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-purple-500 disabled:opacity-50 transition-colors duration-200 flex items-center gap-2">
Start Batch Import <i class="fa-solid fa-rocket"></i>
<span>Start Batch Import</span>
</button> </button>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- Include the import JavaScript --> <!-- Include the import JavaScript -->
<script src="/static/js/admin_import.js"></script> <script src="/static/js/admin_import.js"></script>
</body> {% endblock %}
</html>