From 18bc24d428aa3e50f345825fb43a656b8fc248df Mon Sep 17 00:00:00 2001 From: Nguyen Ngo Date: Wed, 27 Aug 2025 21:26:12 -0400 Subject: [PATCH] Fix Delete Employee button --- app.py | 31 +++- static/css/employees.css | 113 ++++++++++++- templates/employees.html | 345 +++++++++++++++++++++++---------------- 3 files changed, 338 insertions(+), 151 deletions(-) diff --git a/app.py b/app.py index a7d7bce..34b76d8 100644 --- a/app.py +++ b/app.py @@ -5879,10 +5879,15 @@ def edit_employee(employee_index): @admin_required @log_database_operations('employee_deletion') def delete_employee(employee_index): - """Delete employee (Admin only)""" + """Delete employee (Admin only) - Enhanced with better logging""" try: + print(f"🗑️ DELETE REQUEST: Employee index {employee_index}") + print(f"📋 Request method: {request.method}") + print(f"👤 User: {session.get('username', 'Unknown')}") + # Get employee by index (primary key) employee = Employee.query.get_or_404(employee_index) + print(f"✅ Found employee: {employee.firstName} {employee.lastName} (ID: {employee.id})") # Store employee data for logging before deletion employee_data = { @@ -5897,28 +5902,42 @@ def delete_employee(employee_index): # Check if employee has attendance records from models.attendance import AttendanceData attendance_count = AttendanceData.query.filter_by(employee_id=str(employee.id)).count() + print(f"📊 Attendance records found: {attendance_count}") if attendance_count > 0: - flash(f'Cannot delete employee "{employee.full_name}". Employee has {attendance_count} attendance records. Please contact system administrator.', 'error') + error_msg = f'Cannot delete employee "{employee.full_name}". Employee has {attendance_count} attendance records. Please contact system administrator.' + print(f"❌ DELETION BLOCKED: {error_msg}") + flash(error_msg, 'error') return redirect(url_for('employees')) + # Proceed with deletion + print(f"🗑️ Proceeding with deletion of employee: {employee_data['firstName']} {employee_data['lastName']}") + db.session.delete(employee) db.session.commit() + print("✅ Employee successfully deleted from database") # Log employee deletion try: logger_handler.logger.info(f"Admin user {session['username']} deleted employee: {employee_data['firstName']} {employee_data['lastName']} (ID: {employee_data['id']})") + print(f"📋 Deletion logged successfully") except Exception as log_error: print(f"⚠️ Logging error (non-critical): {log_error}") - flash(f'Employee "{employee_data["firstName"]} {employee_data["lastName"]}" deleted successfully.', 'success') + success_msg = f'Employee "{employee_data["firstName"]} {employee_data["lastName"]}" deleted successfully.' + flash(success_msg, 'success') + print(f"✅ SUCCESS: {success_msg}") + + return redirect(url_for('employees')) except Exception as e: db.session.rollback() logger_handler.log_database_error('employee_deletion', e) - flash('Error deleting employee. Please try again.', 'error') - - return redirect(url_for('employees')) + error_msg = f'Error deleting employee. Please try again.' + print(f"❌ ERROR in delete_employee: {e}") + print(f"❌ Exception type: {type(e)}") + flash(error_msg, 'error') + return redirect(url_for('employees')) @app.route('/api/employees/search') @login_required diff --git a/static/css/employees.css b/static/css/employees.css index 017af86..2a2a2e7 100644 --- a/static/css/employees.css +++ b/static/css/employees.css @@ -709,4 +709,115 @@ mark { .modal-footer { flex-direction: column; } -} \ No newline at end of file +} + +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.6); + z-index: 9999; + display: none; + justify-content: center; + align-items: center; + opacity: 0; + transition: opacity 0.3s ease-in-out; +} + +.modal.show { + opacity: 1; +} + +.modal-content { + background: #ffffff; + border-radius: 0.75rem; + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), + 0 10px 10px -5px rgba(0, 0, 0, 0.04); + max-width: 500px; + width: 90%; + max-height: 90vh; + overflow-y: auto; + transform: translateY(-20px); + transition: transform 0.3s ease-in-out; +} + +.modal.show .modal-content { + transform: translateY(0); +} + +.modal-header { + padding: 1.5rem 1.5rem 1rem; + border-bottom: 1px solid #e5e7eb; + display: flex; + justify-content: space-between; + align-items: center; +} + +.modal-header h3 { + margin: 0; + color: #dc2626; + font-size: 1.25rem; + font-weight: 600; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.modal-body { + padding: 1.5rem; +} + +.modal-footer { + padding: 1rem 1.5rem; + border-top: 1px solid #e5e7eb; + display: flex; + justify-content: flex-end; + gap: 0.75rem; +} + +.close-modal { + background: none; + border: none; + color: #6b7280; + cursor: pointer; + padding: 0.25rem; + border-radius: 0.375rem; + transition: all 0.2s ease-in-out; +} + +.close-modal:hover { + color: #374151; + background: #f3f4f6; +} + +.warning-text { + color: #dc2626; + font-size: 0.875rem; + margin-top: 0.75rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +/* Enhanced button styles for better interaction feedback */ +.btn-danger:hover { + background-color: #b91c1c; + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(220, 38, 38, 0.3); +} + +.delete-btn:hover { + background-color: #b91c1c !important; + transform: translateY(-1px); + box-shadow: 0 4px 8px rgba(220, 38, 38, 0.3); +} + +/* Loading state for delete button */ +.btn-danger:disabled { + background-color: #9ca3af; + cursor: not-allowed; + transform: none; + box-shadow: none; +} diff --git a/templates/employees.html b/templates/employees.html index 47fac99..987b98b 100644 --- a/templates/employees.html +++ b/templates/employees.html @@ -1,13 +1,11 @@ -{% extends "base_authenticated.html" %} -{% set page_title = "Employee Management" %} - -{% block title %}{{ page_title }}{% endblock %} - -{% block extra_head %} - -{% endblock %} - -{% block content %} +{% extends "base_authenticated.html" %} {% set page_title = "Employee +Management" %} {% block title %}{{ page_title }}{% endblock %} {% block +extra_head %} + +{% endblock %} {% block content %}
@@ -18,13 +16,13 @@ Back to Dashboard
- +

Employee Management

Manage employee records and view attendance statistics

- +
{% if session.role == 'admin' %} @@ -46,7 +44,7 @@

Total Employees

- +
@@ -56,7 +54,7 @@

With Job Titles

- +
@@ -66,7 +64,7 @@

Unique Job Titles

- + {% if search %}
@@ -84,19 +82,23 @@
- + /> {% if search %} - + {% endif %} @@ -108,17 +110,13 @@

- {% if search %} - Search Results for "{{ search }}" - {% else %} - All Employees - {% endif %} + {% if search %} Search Results for "{{ search }}" {% else %} All + Employees {% endif %}

Showing {{ employees.items|length }} of {{ employees.total }} employees - {% if employees.pages > 1 %} - (Page {{ employees.page }} of {{ employees.pages }}) - {% endif %} + {% if employees.pages > 1 %} (Page {{ employees.page }} of {{ + employees.pages }}) {% endif %}
@@ -137,12 +135,14 @@ {% for employee in employees.items %} - {{ loop.index + (employees.page - 1) * employees.per_page }} - + + {{ loop.index + (employees.page - 1) * employees.per_page }} + + {{ employee.id }} - +
@@ -154,38 +154,44 @@
- + {% if employee.title %} - {{ employee.title }} + {{ employee.title }} {% else %} - No Title + No Title {% endif %} - + {{ employee.contractId }} - +
- + - + {% if session.role == 'admin' %} - + - - {% endif %} @@ -205,41 +211,44 @@ {% if employees.has_prev %}
  • - + Previous
  • {% endif %} - + - {% for page_num in employees.iter_pages() %} - {% if page_num %} - {% if page_num != employees.page %} -
  • - - {{ page_num }} - -
  • - {% else %} -
  • - {{ page_num }} -
  • - {% endif %} - {% else %} -
  • - -
  • - {% endif %} - {% endfor %} - + {% for page_num in employees.iter_pages() %} {% if page_num %} {% if + page_num != employees.page %} +
  • + + {{ page_num }} + +
  • + {% else %} +
  • + {{ page_num }} +
  • + {% endif %} {% else %} +
  • + +
  • + {% endif %} {% endfor %} + {% if employees.has_next %}
  • - + Next @@ -257,18 +266,15 @@
  • - {% if search %} - No employees found for "{{ search }}" - {% else %} - No employees found - {% endif %} + {% if search %} No employees found for "{{ search }}" {% else %} No + employees found {% endif %}

    - {% if search %} - Try adjusting your search terms or view all employees. - {% else %} - Get started by adding your first employee. - {% endif %} + {% if search %} Try adjusting your search terms or + view all employees. {% else %} + Get started by + adding your first employee. {% endif %}

    {% endif %} @@ -285,15 +291,19 @@
    -{% endblock %} - -{% block extra_scripts %} +{% endblock %} {% block extra_scripts %} -{% endblock %} \ No newline at end of file +{% endblock %}