filter task show main task value and main and sub task edit

This commit is contained in:
Pooja Fulari
2026-04-21 10:27:13 +05:30
parent c6f543c63f
commit e46e1e52bb
58 changed files with 412 additions and 253 deletions

View File

@@ -3,7 +3,6 @@ from flask_login import login_user, logout_user, current_user
from ldap3 import Server, Connection, ALL
from app import LDAPUser
def login_controller():
if current_user.is_authenticated:
return redirect(url_for("main.dashboard"))
@@ -56,7 +55,6 @@ def login_controller():
# return render_template("login.html")
# ldap_user_dn = f"uid={username},ou=users,dc=lcepl,dc=org"
# try:
# # Connect to LDAP server
# # server = Server("openldap", port=389, get_info=ALL)

View File

@@ -8,7 +8,6 @@ from app import db
def dashboard_controller():
selected_block = request.args.getlist('block[]', None)
rate_col = cast(Task.rate, Float)
qty_col = cast(Task.in_this_ra_bill_qty, Float)
@@ -29,7 +28,6 @@ def dashboard_controller():
if selected_block and "All" not in selected_block:
query = query.filter(Task.block_name.in_(selected_block))
query = query.group_by(Task.block_name, Task.village_name)
villages = query.all()

View File

@@ -4,6 +4,10 @@ from app import db
from app.models import Task, WorkDetail
from app.service.logger import log_activity
import pandas as pd
from flask import request, send_file
from io import BytesIO
def filter_tasks_controller():
@@ -18,7 +22,7 @@ def filter_tasks_controller():
# blocks
if district:
blocks = [b[0] for b in db.session.query(WorkDetail.block)
.filter(WorkDetail.district == district).distinct()]
.filter(WorkDetail.district == district).distinct()]
else:
blocks = []
@@ -40,7 +44,7 @@ def filter_tasks_controller():
query = (
db.session.query(Task)
.join(WorkDetail,
Task.village_name == WorkDetail.name_of_village)
Task.village_name == WorkDetail.name_of_village)
.filter(
WorkDetail.district == district,
WorkDetail.block == block,
@@ -94,4 +98,59 @@ def filter_tasks_controller():
selected_district=district,
selected_block=block,
selected_village=village
)
def download_filtered_tasks_controller():
district = request.args.get('district')
block = request.args.get('block')
village = request.args.get('village')
query = (
db.session.query(Task)
.join(WorkDetail,
Task.village_name == WorkDetail.name_of_village)
.filter(
WorkDetail.district == district,
WorkDetail.block == block,
WorkDetail.name_of_village == village
)
)
tasks = query.all()
data = []
for task in tasks:
data.append({
"Task Name": task.task_name,
"Unit": task.unit,
"Qty": task.qty,
"Rate": task.rate,
"BOQ Amount": task.boq_amount,
"Prev Billed Qty": task.previous_billed_qty,
"Prev Billing Amount": task.previous_billing_amount,
"RA Bill Qty": task.in_this_ra_bill_qty,
"RA Bill Amount": task.in_this_ra_billing_amount,
"Cum Billed Qty": task.cumulative_billed_qty,
"Cum Billed Amount": task.cumulative_billed_amount,
"Variation Qty": task.variation_qty,
"Variation Amount": task.variation_amount,
})
df = pd.DataFrame(data)
output = BytesIO()
df.to_excel(output, index=False, engine='openpyxl')
output.seek(0)
filename = f"{district}_{block}_{village}_tasks.xlsx"
return send_file(
output,
download_name=filename,
as_attachment=True,
mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
)

View File

@@ -5,7 +5,7 @@ from app.models import Task
from app.service.logger import log_activity
def generate_report_page_controller():
def generate_report_page_controller():
selected_district = request.args.get('district')
selected_block = request.args.get('block')

View File

@@ -8,21 +8,23 @@ from app.service.logger import log_activity
def recalc_task(task):
rate = float(task.rate or 0)
qty = float(task.qty or 0)
prev_qty = float(task.previous_billed_qty or 0)
ra_qty = float(task.in_this_ra_bill_qty or 0)
# H = G * E
task.previous_billing_amount = round(prev_qty * rate, 2)
# J = I * E
task.in_this_ra_billing_amount = round(ra_qty * rate, 2)
# K = I + G
task.cumulative_billed_qty = round(prev_qty + ra_qty, 2)
# L = K * E
task.cumulative_billed_amount = round(task.cumulative_billed_qty * rate, 2)
# M = IF(K > D , K - D , 0)
if task.cumulative_billed_qty > qty:
task.variation_qty = round(task.cumulative_billed_qty - qty, 2)
else:
task.variation_qty = 0
# N = M * E
task.variation_amount = round(task.variation_qty * rate, 2)
@@ -40,116 +42,54 @@ def update_tasks_controller():
"variation_qty",
"variation_amount"
]
for key, new_value in updates.items():
if '_' not in key:
continue
field_name, task_id_str = key.rsplit('_', 1)
if not task_id_str.isdigit():
continue
task = Task.query.get(int(task_id_str))
if task:
if field_name in formula_fields:
continue
current_value = getattr(task, field_name, None)
if str(current_value) != str(new_value):
setattr(task, field_name, new_value)
recalc_task(task)
update_count += 1
log_activity(
current_user.username,
"Task Update",
f"Task ID {task.id} - {field_name} changed to {new_value}"
)
if update_count > 0:
db.session.commit()
log_activity(
current_user.username,
"Database Commit",
f"{update_count} task field(s) updated"
)
return jsonify({'message': f'count: {update_count} field(s) updated.'})
return jsonify({'message': 'No fields were updated.'})
except Exception as e:
log_activity(current_user.username, "Error", str(e))
return jsonify({'error': 'Update failed'}), 500
# # Update tasks route
# @main.route('/update_tasks', methods=['POST'])
# @login_required
# def update_tasks():
# try:
# updates = request.get_json()
# update_count = 0
# for key, new_value in updates.items():
# if '_' not in key:
# continue
# field_name, task_id_str = key.rsplit('_', 1)
# if not task_id_str.isdigit():
# continue
# task_id = int(task_id_str)
# task = db.session.query(Task).filter_by(id=task_id).first()
# if task:
# current_value = getattr(task, field_name, None)
# if current_value != new_value:
# setattr(task, field_name, new_value)
# update_count += 1
# log_activity(current_user.username, "Task Update", f"Task ID {task.id} - {field_name} changed to {new_value}")
# if update_count > 0:
# db.session.commit()
# log_activity(current_user.username, "Database Commit", f"{update_count} task field(s) updated")
# return jsonify({'message': f'count: {update_count} field(s) updated.'})
# else:
# return jsonify({'message': 'No fields were updated.'})
# except Exception as e:
# log_activity(current_user.username, "Error", f"Update tasks error: {str(e)}")
# return jsonify({'error': 'An error occurred while updating tasks.'}), 500
def display_tasks_controller():
work_details = WorkDetail.query.order_by(
WorkDetail.uploaded_at.desc()
).first()
if not work_details:
log_activity(current_user.username, "Tasks View", "No work details")
return "No work details available.", 404
tasks = Task.query.filter_by(
district=work_details.district,
village_name=work_details.name_of_village,
block_name=work_details.block
).order_by(Task.uploaded_at.desc()).all()
grouped_tasks = []
current_main_task = None
for task in tasks:
task_data = {
"id": task.id,
"task_name": task.task_name,
@@ -168,20 +108,17 @@ def display_tasks_controller():
"remark": task.remark,
"district": task.district
}
if task.serial_number:
task_data["subtasks"] = []
grouped_tasks.append(task_data)
current_main_task = task_data
elif current_main_task:
current_main_task["subtasks"].append(task_data)
log_activity(
current_user.username,
"Tasks View",
f"{work_details.name_of_village}, {work_details.block}"
)
return render_template(
'tasks_display.html',
work_details=work_details,

View File

@@ -4,8 +4,8 @@ from flask import request, redirect, url_for, current_app
from flask_login import current_user
from app import db
from app.models import Task, WorkDetail
from datetime import datetime
from app.service.logger import log_activity
# keep helper inside controller
def to_2_decimal(value):
try:
@@ -15,7 +15,6 @@ def to_2_decimal(value):
except (TypeError, ValueError):
return None
def upload_controller():
if 'file' not in request.files:
return "No file part"
@@ -31,7 +30,6 @@ def upload_controller():
log_activity(current_user.username, "File Upload", f"Uploaded file: {file.filename}")
work_details_data = pd.read_excel(filepath, nrows=11, header=None, dtype=str)
work_details_dict = {
"name_of_work": work_details_data.iloc[0, 1],
"cover_agreement_no": work_details_data.iloc[1, 1],
@@ -45,15 +43,11 @@ def upload_controller():
"measurement_book": work_details_data.iloc[9, 1],
"district": work_details_data.iloc[10, 1]
}
work_details_dict = {k: (None if pd.isna(v) else v) for k, v in work_details_dict.items()}
work_detail = WorkDetail(**work_details_dict)
db.session.add(work_detail)
data = pd.read_excel(filepath, skiprows=10)
data = data.astype(object).where(pd.notna(data), None)
expected_columns = [
"serial_number", "task_name", "unit", "qty", "rate", "boq_amount",
"previous_billed_qty", "previous_billing_amount",
@@ -61,27 +55,21 @@ def upload_controller():
"cumulative_billed_qty", "cumulative_billed_amount",
"variation_qty", "variation_amount", "remark"
]
if data.shape[1] == len(expected_columns):
data.columns = expected_columns
else:
data.columns = expected_columns[:data.shape[1]]
current_main_task_serial = None
current_main_task_name = None
for _, row in data.iterrows():
task_name = str(row["task_name"]) if row["task_name"] else ""
serial_number = str(row["serial_number"]) if row["serial_number"] else None
if serial_number:
current_main_task_serial = serial_number
current_main_task_name = task_name
parent_id = None
else:
parent_id = current_main_task_serial
task = Task(
district=work_details_dict.get("district"),
block_name=work_details_dict["block"],
@@ -104,11 +92,9 @@ def upload_controller():
parent_task_name=current_main_task_name if not serial_number else None,
remark=row["remark"]
)
db.session.add(task)
db.session.commit()
log_activity(
current_user.username,
"Database Insert",
@@ -118,97 +104,3 @@ def upload_controller():
return redirect(url_for('main.display_tasks'))
# # File upload route
# @main.route('/upload', methods=['POST'])
# @login_required
# def upload():
# if 'file' not in request.files:
# return "No file part"
# file = request.files['file']
# if file.filename == '':
# return "No selected file"
# if file:
# filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], file.filename)
# file.save(filepath)
# log_activity(current_user.username, "File Upload", f"Uploaded file: {file.filename}")
# # Read work details (first 11 rows)
# work_details_data = pd.read_excel(filepath, nrows=11, header=None)
# work_details_dict = {
# "name_of_work": work_details_data.iloc[0, 1],
# "cover_agreement_no": work_details_data.iloc[1, 1],
# "name_of_contractor": work_details_data.iloc[2, 1],
# "name_of_tpi_agency": work_details_data.iloc[3, 1],
# "name_of_division": work_details_data.iloc[4, 1],
# "name_of_village": work_details_data.iloc[5, 1],
# "block": work_details_data.iloc[6, 1],
# "scheme_id": work_details_data.iloc[7, 1],
# "date_of_billing": work_details_data.iloc[8, 1],
# "measurement_book": work_details_data.iloc[9, 1],
# "district": work_details_data.iloc[10, 1] # Example: row 11 (index 10), column 2 (index 1)
# }
# work_details_dict = {key: (None if pd.isna(value) else value) for key, value in work_details_dict.items()}
# work_detail = WorkDetail(**work_details_dict)
# db.session.add(work_detail)
# # Read task data starting from row 12
# data = pd.read_excel(filepath, skiprows=10)
# data = data.astype(str).replace({"nan": None, "NaT": None, "None": None})
# expected_columns = [
# "serial_number", "task_name", "unit", "qty", "rate", "boq_amount",
# "previous_billed_qty", "previous_billing_amount",
# "in_this_ra_bill_qty", "in_this_ra_billing_amount",
# "cumulative_billed_qty", "cumulative_billed_amount",
# "variation_qty", "variation_amount", "remark"
# ]
# if data.shape[1] == len(expected_columns):
# data.columns = expected_columns
# else:
# data.columns = expected_columns[:data.shape[1]] # Truncate
# current_main_task_serial = None
# current_main_task_name = None
# for _, row in data.iterrows():
# task_name = str(row["task_name"]) if row["task_name"] else ""
# serial_number = row["serial_number"]
# if serial_number: # Main task
# current_main_task_serial = serial_number
# current_main_task_name = task_name
# parent_id = None
# else: # Subtask
# parent_id = current_main_task_serial
# task = Task(
# district=work_details_dict.get("district"),
# block_name=work_details_dict["block"],
# village_name=work_details_dict["name_of_village"],
# serial_number=serial_number,
# task_name=task_name,
# unit=row["unit"],
# qty=row["qty"],
# rate=row["rate"],
# boq_amount=row["boq_amount"],
# previous_billed_qty=row["previous_billed_qty"],
# previous_billing_amount=row["previous_billing_amount"],
# in_this_ra_bill_qty=row["in_this_ra_bill_qty"],
# in_this_ra_billing_amount=row["in_this_ra_billing_amount"],
# cumulative_billed_qty=row["cumulative_billed_qty"],
# cumulative_billed_amount=row["cumulative_billed_amount"],
# variation_qty=row["variation_qty"],
# variation_amount=row["variation_amount"],
# parent_id=parent_id,
# parent_task_name=current_main_task_name if not serial_number else None,
# remark=row["remark"]
# )
# db.session.add(task)
# db.session.commit()
# log_activity(current_user.username, "Database Insert", f"Inserted work details and tasks from {file.filename}")
# return redirect(url_for('main.display_tasks'))

View File

@@ -97,6 +97,7 @@ def create_app():
from app.routes.reports import reports as reports_bp
app.register_blueprint(main_bp)
app.register_blueprint(reports_bp)
except ImportError as e:
print(f"Error importing blueprints: {e}")

View File

@@ -4309,3 +4309,200 @@ Timestamp: 2026-04-15 11:51:20 | User: admin | Action: Task Update | Details: Ta
Timestamp: 2026-04-15 11:51:20 | User: admin | Action: Database Commit | Details: 1 task field(s) updated
Timestamp: 2026-04-15 11:51:21 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 11:55:04 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 12:34:30 | User: admin | Action: Task Update | Details: Task ID 5 - rate changed to 200025.06
Timestamp: 2026-04-15 12:34:30 | User: admin | Action: Database Commit | Details: 1 task field(s) updated
Timestamp: 2026-04-15 12:34:30 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 12:34:46 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 13:22:44 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-15 13:22:46 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:22:58 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 13:23:28 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:23:31 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:23:46 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:23:51 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:23:56 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:24:00 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:24:07 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:24:11 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:24:14 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:24:19 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:24:22 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:24:25 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:24:28 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:24:31 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:24:35 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:24:39 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:24:42 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:24:46 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:24:49 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:24:53 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:24:58 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:25:02 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:25:13 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:25:22 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 13:27:09 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:27:12 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:27:18 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:27:21 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:27:31 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:27:54 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:27:57 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:28:08 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:33:19 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-15 13:33:25 | User: admin | Action: File Upload | Details: Uploaded file: Asadpur bamnauli.xlsx
Timestamp: 2026-04-15 13:33:26 | User: admin | Action: Database Insert | Details: Inserted work details and tasks from Asadpur bamnauli.xlsx
Timestamp: 2026-04-15 13:33:26 | User: admin | Action: Tasks View | Details: Asadpur Bamnauli, Kairana
Timestamp: 2026-04-15 13:34:33 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:34:42 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-15 13:34:43 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:34:50 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:34:51 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:34:58 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-15 13:34:59 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:35:04 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:35:06 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:35:09 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 13:35:16 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 13:35:22 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kairana
Timestamp: 2026-04-15 13:36:02 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 13:36:49 | User: admin | Action: Task Update | Details: Task ID 7 - previous_billed_qty changed to 4
Timestamp: 2026-04-15 13:36:49 | User: admin | Action: Database Commit | Details: 1 task field(s) updated
Timestamp: 2026-04-15 13:36:51 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 14:55:01 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 15:40:52 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 15:40:56 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 16:38:21 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 16:38:31 | User: admin | Action: Task Update | Details: Task ID 5 - previous_billed_qty changed to 3
Timestamp: 2026-04-15 16:38:31 | User: admin | Action: Database Commit | Details: 1 task field(s) updated
Timestamp: 2026-04-15 16:38:34 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 16:39:09 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 16:40:13 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 17:03:03 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-15 17:03:05 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 17:03:11 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 17:03:24 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 17:03:53 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli
Timestamp: 2026-04-15 17:04:32 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-15 17:05:48 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 17:06:09 | User: admin | Action: Task Update | Details: Task ID 5 - in_this_ra_bill_qty changed to 5
Timestamp: 2026-04-15 17:06:10 | User: admin | Action: Database Commit | Details: 1 task field(s) updated
Timestamp: 2026-04-15 17:06:12 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-15 17:06:50 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli
Timestamp: 2026-04-15 17:07:05 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-15 17:07:08 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kairana
Timestamp: 2026-04-15 17:08:40 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli
Timestamp: 2026-04-16 15:38:01 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-16 15:38:02 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-16 15:38:08 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli
Timestamp: 2026-04-16 15:40:15 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli
Timestamp: 2026-04-16 15:41:52 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-16 15:45:55 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-16 15:46:09 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-16 16:43:33 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-16 16:43:38 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-16 16:43:57 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-16 16:45:50 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-16 16:45:56 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-16 16:45:59 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-16 16:46:00 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-16 16:46:01 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-17 10:39:37 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-17 10:48:16 | User: admin | Action: Task Update | Details: Task ID 9 - previous_billed_qty changed to 5
Timestamp: 2026-04-17 10:48:16 | User: admin | Action: Database Commit | Details: 1 task field(s) updated
Timestamp: 2026-04-17 10:48:17 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-17 10:56:16 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-17 11:14:15 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:14:19 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:14:26 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:14:37 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:14:43 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:14:57 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:15:09 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:15:12 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:15:19 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:15:26 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:15:28 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:15:32 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-17 11:15:41 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:15:50 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:16:56 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:16:58 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:17:06 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:17:10 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:17:54 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:17:55 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:17:58 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:18:01 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:18:17 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:18:18 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:19:57 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:20:00 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:23:27 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:23:30 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:24:15 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:24:37 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:24:40 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:26:22 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:27:27 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:27:30 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:28:09 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:28:41 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 11:28:44 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-17 11:44:45 | User: admin | Action: Task Update | Details: Task ID 14 - previous_billed_qty changed to 34
Timestamp: 2026-04-17 11:44:45 | User: admin | Action: Task Update | Details: Task ID 15 - previous_billed_qty changed to 34
Timestamp: 2026-04-17 11:44:45 | User: admin | Action: Task Update | Details: Task ID 16 - previous_billed_qty changed to 34
Timestamp: 2026-04-17 11:44:45 | User: admin | Action: Task Update | Details: Task ID 17 - previous_billed_qty changed to 34
Timestamp: 2026-04-17 11:44:46 | User: admin | Action: Database Commit | Details: 4 task field(s) updated
Timestamp: 2026-04-17 11:44:48 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-17 15:28:30 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-17 15:28:33 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-18 11:05:41 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-18 11:18:31 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-18 11:18:33 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-18 11:27:44 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-18 11:27:48 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-18 11:27:52 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-18 11:29:11 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-18 11:29:13 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-18 11:29:23 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-20 13:39:03 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 14:05:29 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-20 14:05:44 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kairana
Timestamp: 2026-04-20 14:06:13 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-20 14:09:27 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-20 16:06:41 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-20 16:40:27 | User: admin | Action: File Upload | Details: Uploaded file: thanabhavan_ahatagarh.xlsx
Timestamp: 2026-04-20 16:41:16 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-20 16:41:21 | User: admin | Action: File Upload | Details: Uploaded file: thanabhavan_ahatagarh.xlsx
Timestamp: 2026-04-20 16:42:10 | User: admin | Action: File Upload | Details: Uploaded file: thanabhavan_ahatagarh.xlsx
Timestamp: 2026-04-20 16:42:11 | User: admin | Action: Database Insert | Details: Inserted work details and tasks from thanabhavan_ahatagarh.xlsx
Timestamp: 2026-04-20 16:42:11 | User: admin | Action: Tasks View | Details: None, None
Timestamp: 2026-04-20 16:47:42 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 16:48:07 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-20 16:48:14 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kairana
Timestamp: 2026-04-20 16:48:22 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-20 16:52:41 | User: admin | Action: Tasks View | Details: None, None
Timestamp: 2026-04-20 16:53:51 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli
Timestamp: 2026-04-20 16:55:24 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-20 16:55:30 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-20 17:18:18 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-20 17:18:43 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 17:22:57 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 17:40:32 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 17:41:37 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 17:49:29 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 18:44:28 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 18:46:24 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 18:51:45 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 18:52:52 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 18:54:38 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 19:40:23 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-20 20:01:45 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-20 20:01:57 | User: admin | Action: Page Load | Details: Upload Excel page accessed
Timestamp: 2026-04-20 20:02:01 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-21 10:02:55 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-21 10:18:57 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi
Timestamp: 2026-04-21 10:20:03 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-21 10:20:08 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla
Timestamp: 2026-04-21 10:20:10 | User: admin | Action: Report Page | Details: district=None, block=None
Timestamp: 2026-04-21 10:20:20 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli

View File

@@ -23,7 +23,7 @@ class User(UserMixin, db.Model):
return f'<User {self.username}>'
# ==========================
# Your existing models below
# DB models below
# ==========================
class Task(db.Model):
@@ -41,7 +41,7 @@ class Task(db.Model):
boq_amount = db.Column(String_size)
previous_billed_qty = db.Column(String_size)
previous_billing_amount = db.Column(String_size)
remaining_amount = db.Column(String_size)
remaining_amount = db.Column(String_size)
in_this_ra_bill_qty = db.Column(String_size)
in_this_ra_billing_amount = db.Column(String_size)
cumulative_billed_qty = db.Column(String_size)
@@ -66,7 +66,7 @@ class WorkDetail(db.Model):
uploaded_at = db.Column(db.DateTime, default=datetime.utcnow)
district = db.Column(db.String(255))
class ActivityLog(db.Model): # OUTSIDE WorkDetail
class ActivityLog(db.Model): # OUTSIDE WorkDetail
id = db.Column(db.Integer, primary_key=True)
user = db.Column(db.String(100)) # can link with User model later
action = db.Column(db.String(255))

View File

@@ -7,93 +7,110 @@ from app.Controllers.auth_controller import (login_controller,logout_controller)
from app.Controllers.upload_controller import upload_controller
from app.Controllers.activity_controller import activity_log_controller
from app.Controllers.task_controller import (update_tasks_controller,display_tasks_controller)
from app.Controllers.filter_controller import filter_tasks_controller
from app.Controllers.filter_controller import (filter_tasks_controller,download_filtered_tasks_controller)
from app.Controllers.report_controller import generate_report_page_controller
from app.Controllers.dropdown_controller import (get_blocks_by_district_controller,get_tasks_by_block_controller,get_villages_by_block_controller)
main = Blueprint("main", __name__)
# -----------Login-----------------------------------
@main.route("/login", methods=["GET", "POST"])
def login():
return login_controller()
@main.route("/logout")
@login_required
def logout():
return logout_controller()
# ----------------------------------------------------
# ------------Upload Excel----------------------------
@main.route('/upload_excel')
@login_required
def upload_excel():
log_activity(current_user.username, "Page Load", "Upload Excel page accessed")
return render_template('upload.html')
# -----------------------------------------------------
# @main.route('/dashboard')
# def upload_file():
# return render_template('dashboard.html')
# -----------Upload-----------------------------------
@main.route('/upload', methods=['POST'])
@login_required
def upload():
return upload_controller()
# ----------------------------------------------------
# -----------Update Task-----------------------------
@main.route('/update_tasks', methods=['POST'])
@login_required
def update_tasks():
return update_tasks_controller()
# -----------------------------------------------------
# --------Task----------------------------------------
@main.route('/tasks')
@login_required
def display_tasks():
return display_tasks_controller()
# ------------------------------------------------------
# ----------------Home----------------------------------
@main.route('/')
@login_required
def dashboard():
return dashboard_controller()
# -------------------------------------------------------
# ----------Get Block By Distrit-------------------------
@main.route('/get_blocks_by_district')
@login_required
def get_blocks_by_district():
return get_blocks_by_district_controller()
# -------------------------------------------------------
# ------------------Get Task by Block--------------------
@main.route('/get_tasks_by_block')
@login_required
def get_tasks_by_block():
return get_tasks_by_block_controller()
# ------------------------------------------------------
# ---------------Get Village by Block--------------------
@main.route('/get_villages_by_block')
@login_required
def get_villages_by_block():
return get_villages_by_block_controller()
# -------------------------------------------------------
# --------------genrate Report--------------------------
@main.route('/generate_report_page')
@login_required
def generate_report_page():
return generate_report_page_controller()
#-----------------------------------------------------
# -----------Filter Task---------------------------------
@main.route('/filter_tasks', methods=['GET'])
@login_required
def filter_tasks():
return filter_tasks_controller()
# --Download Filter Task--
@main.route('/download_filtered_tasks', methods=['GET'])
def download_filtered_tasks():
return download_filtered_tasks_controller()
# -----------------------------------------------------------
# ----------------Activity Log--------------------------
@main.route('/activity_log', methods=['GET', 'POST'])
@login_required
def activity_log():
return activity_log_controller()
# -----------------------------------------------------------

View File

@@ -279,6 +279,7 @@
<button class="edit-mode-button" type="button" onclick="toggleEditMode()">Edit Tasks</button>
<button class="edit-mode-button" type="button" id="cancelBtn" onclick="cancelEditMode()" style="display: none;">Cancel</button>
<button class="edit-mode-button" type="button" onclick="submitChangedFields()">Submit Updates</button>
<button class="edit-mode-button" type="button" onclick="downloadExcel()">Download Excel</button>
</div>
{% if grouped_tasks %}
@@ -311,25 +312,50 @@
] %}
{% for group in grouped_tasks %}
<tr class="main-task-row">
<!-- <tr class="main-task-row">
<td colspan="1">{{ group.task_name }}</td>
</tr>
</tr> -->
<!-- <tr class="main-task-row">
{% for field in ["task_name","unit","qty","rate","boq_amount","previous_billed_qty","previous_billing_amount","in_this_ra_bill_qty","in_this_ra_billing_amount","cumulative_billed_qty","cumulative_billed_amount","variation_qty","variation_amount"] %}
<td>
{{ '' if group[field] in [None, 0, "0"] else group[field] }}
</td>
{% endfor %}
</tr> -->
<tr class="main-task-row">
{% for field in ["task_name","unit","qty","rate","boq_amount","previous_billed_qty","previous_billing_amount","in_this_ra_bill_qty","in_this_ra_billing_amount","cumulative_billed_qty","cumulative_billed_amount","variation_qty","variation_amount"] %}
<td>
<span class="static-text">
{{ group[field] if group[field] is not none else '' }}
</span>
<input
type="text"
class="edit-field"
name="{{ field }}_main_{{ loop.index }}"
value="{{ group[field] if group[field] is not none else '' }}"
data-original-value="{{ group[field] if group[field] is not none else '' }}"
>
</td>
{% endfor %}
</tr>
{% for sub in group.subtasks %}
<tr class="subtask-row">
{% for field in ["task_name","unit","qty","rate","boq_amount","previous_billed_qty","previous_billing_amount","in_this_ra_bill_qty","in_this_ra_billing_amount","cumulative_billed_qty","cumulative_billed_amount","variation_qty","variation_amount"] %}
<td>
<span class="static-text">{{ sub[field] }}</span>
<span class="static-text">
{{ sub[field] if sub[field] is not none else '' }}
</span>
<input
<input
type="text"
class="edit-field"
name="{{ field }}_{{ sub.id }}"
value="{{ sub[field] }}"
data-original-value="{{ sub[field] | trim }}"
value="{{ sub[field] if sub[field] is not none else '' }}"
data-original-value="{{ sub[field] if sub[field] is not none else '' }}"
{% if field in formula_fields %} readonly style="background:#f5f5f5;" {% endif %}
>
</td>
>
</td>
{% endfor %}
</tr>
{% endfor %}
@@ -434,6 +460,15 @@
}
});
});
function downloadExcel() {
const district = document.getElementById("district").value;
const block = document.getElementById("block").value;
const village = document.getElementById("village").value;
let url = `/download_filtered_tasks?district=${district}&block=${block}&village=${village}`;
window.location.href = url;
}
</script>
</body>
</html>

View File

@@ -3,10 +3,15 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<!-- <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"> -->
<title>LAXMI CIVIL ENGINEERING SERVICES PVT. LTD.</title>
<style>
*{
padding:0;
margin: 0 ;
box-sizing: border-box;
}
body {
margin: 0;
font-family: Arial, sans-serif;
@@ -29,13 +34,13 @@
flex-direction: column;
align-items: center;
}
.sidebar .logo {
width: 150px;
height: auto;
margin-bottom: 20px;
}
.sidebar a {
display: block;
color: #333;
@@ -45,12 +50,11 @@
border-radius: 5px;
text-align: center;
}
.sidebar a:hover {
background-color: #007bff;
color: white;
}
.header {
width: 100%;
background-color: #007bff;
@@ -65,7 +69,20 @@
left: 0;
z-index: 1000;
}
.header span {
display: inline-flex;
white-space: nowrap;
animation: scrollText 15s linear infinite;
}
@keyframes scrollText {
from {
transform: translateX(100%);
}
to {
transform: translateX(-100%);
}
}
.container {
margin: 100px 20px 20px 330px;
padding: 20px;
@@ -75,14 +92,14 @@
width: calc(100% - 270px);
max-width: 1500px;
}
.table-container {
margin: 20px auto;
width: 100%;
max-height: calc(18 * 40px);
overflow-y: auto;
}
table {
width: 100%;
border-collapse: collapse;
@@ -90,13 +107,13 @@ table {
font-size: 16px;
text-align: left;
}
th,
td {
padding: 12px;
border: 1px solid #ddd;
}
th {
background-color: #007bff;
color: white;
@@ -105,13 +122,11 @@ th {
top: 0; /* Keeps the header fixed at the top */
z-index: 1; /* Ensures it's above the content */
}
tr:nth-child(even) {
background-color: #f2f2f2;
}
.total-row {
position: -webkit-sticky; /* For Safari */
position: sticky;
@@ -123,17 +138,21 @@ tr:nth-child(even) {
color: #ddd;
display: table-row; /* Ensures row alignment is maintained */
}
.amount {
text-align: left;
}
.summary-title {
text-align: center;
font-size: 24px;
font-size: 30px;
font-weight: bold;
font-family:'Times New Roman', Times, serif;
margin-bottom: 20px;
}
.summary-title:hover{
color: #ff0b23;
}
/* Style for the filter and search inputs */
.filter-container,
.search-container {
@@ -141,14 +160,14 @@ tr:nth-child(even) {
display: flex;
flex-direction: column;
}
.filter-container label,
.search-container label {
font-size: 16px;
margin-bottom: 5px;
font-weight: bold;
}
#blockSelect,
#search-input {
width: 100%;
@@ -158,29 +177,29 @@ tr:nth-child(even) {
border-radius: 5px;
box-sizing: border-box; /* Ensures padding is included in width */
}
#blockSelect {
max-width: 300px;
}
#search-input {
max-width: 400px;
}
#blockSelect:focus,
#search-input:focus {
border-color: #007bff;
outline: none;
box-shadow: 0 0 5px rgba(0, 123, 255, 0.5);
}
@media screen and (max-width: 768px) {
/* Adjust layout for mobile responsiveness */
.filter-container,
.search-container {
margin-bottom: 15px;
}
#blockSelect,
#search-input {
width: 100%;
@@ -194,7 +213,7 @@ tr:nth-child(even) {
width: 180px; /* reduced width */
font-size: 14px; /* smaller font */
}
/* Smaller dropdown button */
.dropdown-btn {
background-color: #ffffff;
@@ -206,7 +225,7 @@ tr:nth-child(even) {
font-size: 14px; /* smaller font */
cursor: pointer;
}
/* Smaller dropdown content */
.dropdown-content {
display: none;
@@ -219,7 +238,7 @@ tr:nth-child(even) {
overflow-y: auto;
font-size: 13px; /* smaller font */
}
/* Smaller checkbox labels */
.dropdown-content label {
display: block;
@@ -227,17 +246,17 @@ tr:nth-child(even) {
cursor: pointer;
font-size: 13px; /* reduced font size */
}
/* Hover effect */
.dropdown-content label:hover {
background-color: #f1f1f1;
}
/* Show the dropdown content when clicked */
.show {
display: block;
}
.submit-btn {
display: inline-block;
margin-left: 20px;
@@ -245,12 +264,11 @@ tr:nth-child(even) {
background-color: #007bff;
padding: 5px 8px 5px 8px;
border-radius: 7px;
border: 1px solid #007bff;
height: 30px;
width: 100px;
border: 1px solid #007bff;
height: 30px;
width: 100px;
}
</style>
</head>
<body>
@@ -268,9 +286,9 @@ tr:nth-child(even) {
<a href="{{ url_for('main.logout') }}" style="margin-top:auto; color: #fff; background-color: #dc3545;">Logout</a>
</div>
<div class="header">LAXMI CIVIL ENGINEERING SERVICES PVT. LTD.</div>
<div class="header"><span>LAXMI CIVIL ENGINEERING SERVICES PVT. LTD.</span></div>
<div class="container">
<h1 class="summary-title">Dashboard</h1>
<h1 class="summary-title">DASHBOARD</h1>
<!-- Block Selection Dropdown -->
<form method="get" action="{{ url_for('main.dashboard') }}">
<div class="filter-container">

View File

@@ -4,33 +4,39 @@
<meta charset="UTF-8" />
<title>LCEPL Client Billing Software</title>
<style>
*{
padding: 0;
margin: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
background: #f3f3f3;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
height: 98.3vh;
}
.login-container {
background: white;
padding: 2rem;
border-radius: 10px;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
width: 300px;
border-radius: 20px;
box-shadow: 10px 10px 20px rgba(110, 0, 0, 0.3);
width: 21%;
}
h2 {
text-align: center;
margin-bottom: 1.5rem;
}
input[type="text"],
input[type="password"] {
width: 100%;
padding: 0.5rem;
margin-bottom: 1rem;
margin-bottom: 1.5rem;
border: 1px solid #ccc;
border-radius: 5px;
}
@@ -57,6 +63,7 @@
.subtitle {
text-align: center;
margin: 20px;
}
</style>
</head>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.