Compare commits
2 Commits
laxmi-dev
...
8750f268db
| Author | SHA1 | Date | |
|---|---|---|---|
| 8750f268db | |||
|
|
b78526ad9f |
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.
@@ -1,8 +1,8 @@
|
|||||||
# routes/gst_release_routes.py
|
from flask import Blueprint, render_template, request, redirect, url_for
|
||||||
from flask import Blueprint, render_template, request, redirect, url_for, flash
|
|
||||||
from flask_login import login_required
|
from flask_login import login_required
|
||||||
from model.gst_release import GSTRelease
|
from model.gst_release import GSTRelease
|
||||||
from model.Log import LogHelper
|
from model.Log import LogHelper
|
||||||
|
from flask import flash, current_app
|
||||||
|
|
||||||
gst_release_bp = Blueprint('gst_release_bp', __name__)
|
gst_release_bp = Blueprint('gst_release_bp', __name__)
|
||||||
gst_service = GSTRelease()
|
gst_service = GSTRelease()
|
||||||
@@ -13,7 +13,7 @@ gst_service = GSTRelease()
|
|||||||
def add_gst_release():
|
def add_gst_release():
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
gst_service.AddGSTRelease(request)
|
gst_service.AddGSTRelease(request)
|
||||||
LogHelper.log_action("Add GST Release", "User added GST release")
|
LogHelper.log_action("Add GST Release", f"User added GST release")
|
||||||
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
|
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
|
||||||
return redirect(url_for('gst_release_bp.add_gst_release'))
|
return redirect(url_for('gst_release_bp.add_gst_release'))
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ def edit_gst_release(gst_release_id):
|
|||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
gst_service.EditGSTRelease(request, gst_release_id)
|
gst_service.EditGSTRelease(request, gst_release_id)
|
||||||
LogHelper.log_action("Edit GST Release", "User edited GST release")
|
LogHelper.log_action("Edit GST Release", f"User edited GST release")
|
||||||
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
|
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
|
||||||
return redirect(url_for('gst_release_bp.add_gst_release'))
|
return redirect(url_for('gst_release_bp.add_gst_release'))
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ def edit_gst_release(gst_release_id):
|
|||||||
@gst_release_bp.route('/delete_gst_release/<int:gst_release_id>', methods=['GET', 'POST'])
|
@gst_release_bp.route('/delete_gst_release/<int:gst_release_id>', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def delete_gst_release(gst_release_id):
|
def delete_gst_release(gst_release_id):
|
||||||
gst_service.DeleteGSTRelease(gst_release_id)
|
gst_service.DeleteGSTRelease(gst_release_id) # remove request
|
||||||
LogHelper.log_action("Delete GST Release", "User deleted GST release")
|
LogHelper.log_action("Delete GST Release", f"User deleted GST release")
|
||||||
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
|
flash(gst_service.resultMessage, 'success' if gst_service.isSuccess else 'error')
|
||||||
return redirect(url_for('gst_release_bp.add_gst_release'))
|
return redirect(url_for('gst_release_bp.add_gst_release'))
|
||||||
@@ -83,17 +83,29 @@ def check_village():
|
|||||||
return village.CheckVillage(request=request)
|
return village.CheckVillage(request=request)
|
||||||
|
|
||||||
|
|
||||||
# ------------------------- Delete Village -------------------------
|
|
||||||
@village_bp.route('/delete_village/<int:village_id>')
|
@village_bp.route('/delete_village/<int:village_id>')
|
||||||
@login_required
|
@login_required
|
||||||
def delete_village(village_id):
|
def delete_village(village_id):
|
||||||
|
|
||||||
village = Village()
|
village = Village()
|
||||||
village.DeleteVillage(request=request, village_id=village_id)
|
village.DeleteVillage(request=request, village_id=village_id)
|
||||||
|
|
||||||
flash(village.resultMessage, "success" if village.isSuccess else "error")
|
# ✅ Convert resultMessage to string if it's a Response or tuple
|
||||||
return redirect(url_for('village.add_village'))
|
raw_msg = village.resultMessage
|
||||||
|
|
||||||
|
if isinstance(raw_msg, tuple):
|
||||||
|
# e.g., (<Response ...>, 200)
|
||||||
|
msg = "Village deleted successfully!"
|
||||||
|
elif hasattr(raw_msg, 'get_data'):
|
||||||
|
# Flask Response object
|
||||||
|
msg = raw_msg.get_data(as_text=True) # get raw text
|
||||||
|
else:
|
||||||
|
# fallback
|
||||||
|
msg = str(raw_msg) if raw_msg else "Village deleted successfully!"
|
||||||
|
|
||||||
|
return jsonify({
|
||||||
|
"status": "success" if village.isSuccess else "error",
|
||||||
|
"message": msg
|
||||||
|
})
|
||||||
|
|
||||||
# ------------------------- Edit Village -------------------------
|
# ------------------------- Edit Village -------------------------
|
||||||
@village_bp.route('/edit_village/<int:village_id>', methods=['GET', 'POST'])
|
@village_bp.route('/edit_village/<int:village_id>', methods=['GET', 'POST'])
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import config
|
|||||||
import re
|
import re
|
||||||
import mysql.connector
|
import mysql.connector
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
# Mapping Class
|
# Mapping Class
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
@@ -22,11 +23,10 @@ class itemCRUDMapping:
|
|||||||
self.name = "Hold Type"
|
self.name = "Hold Type"
|
||||||
elif itemType is ItemCRUDType.Subcontractor:
|
elif itemType is ItemCRUDType.Subcontractor:
|
||||||
self.name = "Subcontractor"
|
self.name = "Subcontractor"
|
||||||
elif itemType.name == "GSTRelease":
|
|
||||||
self.name = "GSTRelease"
|
|
||||||
else:
|
else:
|
||||||
self.name = "Item"
|
self.name = "Item"
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
# Generic CRUD Class
|
# Generic CRUD Class
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
@@ -93,47 +93,13 @@ class ItemCRUD:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# ======================================================
|
# ======================================================
|
||||||
# GSTRelease MULTI-FIELD
|
# SUBCONTRACTOR (MULTI-FIELD)
|
||||||
# ======================================================
|
# ======================================================
|
||||||
if self.itemCRUDType.name == "GSTRelease" and data:
|
if data:
|
||||||
|
|
||||||
# Duplicate check (PMC_No + Invoice_No)
|
|
||||||
if storedprocfetch:
|
|
||||||
cursor.callproc(storedprocfetch, (data['PMC_No'], data['Invoice_No']))
|
|
||||||
existing_item = None
|
|
||||||
for rs in cursor.stored_results():
|
|
||||||
existing_item = rs.fetchone()
|
|
||||||
if existing_item:
|
|
||||||
self.isSuccess = False
|
|
||||||
self.resultMessage = HtmlHelper.json_response(
|
|
||||||
ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
# Insert GSTRelease
|
|
||||||
cursor.callproc(storedprocadd, (
|
|
||||||
data['PMC_No'],
|
|
||||||
data['Invoice_No'],
|
|
||||||
data['Basic_Amount'],
|
|
||||||
data['Final_Amount'],
|
|
||||||
data['Total_Amount'],
|
|
||||||
data['UTR'],
|
|
||||||
data['Contractor_ID']
|
|
||||||
))
|
|
||||||
connection.commit()
|
|
||||||
|
|
||||||
self.isSuccess = True
|
|
||||||
self.resultMessage = HtmlHelper.json_response(
|
|
||||||
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
# ======================================================
|
|
||||||
# SUBCONTRACTOR MULTI-FIELD
|
|
||||||
# ======================================================
|
|
||||||
if self.itemCRUDType.name == "Subcontractor" and data:
|
|
||||||
|
|
||||||
|
# Duplicate check
|
||||||
cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
|
cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
|
||||||
|
|
||||||
existing_item = None
|
existing_item = None
|
||||||
for rs in cursor.stored_results():
|
for rs in cursor.stored_results():
|
||||||
existing_item = rs.fetchone()
|
existing_item = rs.fetchone()
|
||||||
@@ -145,6 +111,7 @@ class ItemCRUD:
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Insert
|
||||||
cursor.callproc(storedprocadd, (
|
cursor.callproc(storedprocadd, (
|
||||||
data['Contractor_Name'],
|
data['Contractor_Name'],
|
||||||
data['Address'],
|
data['Address'],
|
||||||
@@ -156,16 +123,17 @@ class ItemCRUD:
|
|||||||
data['GST_No'],
|
data['GST_No'],
|
||||||
data['Contractor_password']
|
data['Contractor_password']
|
||||||
))
|
))
|
||||||
|
|
||||||
connection.commit()
|
connection.commit()
|
||||||
|
|
||||||
self.isSuccess = True
|
self.isSuccess = True
|
||||||
self.resultMessage = HtmlHelper.json_response(
|
self.resultMessage = HtmlHelper.json_response(
|
||||||
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
# ======================================================
|
# ======================================================
|
||||||
# NORMAL SINGLE-FIELD (Village / Block / State)
|
# NORMAL (Village / Block / State)
|
||||||
# ======================================================
|
# ======================================================
|
||||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||||
self.isSuccess = False
|
self.isSuccess = False
|
||||||
@@ -174,6 +142,7 @@ class ItemCRUD:
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Duplicate check
|
||||||
if parentid is None:
|
if parentid is None:
|
||||||
cursor.callproc(storedprocfetch, (childname,))
|
cursor.callproc(storedprocfetch, (childname,))
|
||||||
else:
|
else:
|
||||||
@@ -190,14 +159,17 @@ class ItemCRUD:
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Insert
|
||||||
if parentid is None:
|
if parentid is None:
|
||||||
cursor.callproc(storedprocadd, (childname,))
|
cursor.callproc(storedprocadd, (childname,))
|
||||||
else:
|
else:
|
||||||
cursor.callproc(storedprocadd, (childname, parentid))
|
cursor.callproc(storedprocadd, (childname, parentid))
|
||||||
|
|
||||||
connection.commit()
|
connection.commit()
|
||||||
|
|
||||||
self.isSuccess = True
|
self.isSuccess = True
|
||||||
self.resultMessage = HtmlHelper.json_response(
|
self.resultMessage = HtmlHelper.json_response(
|
||||||
|
|
||||||
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -227,33 +199,9 @@ class ItemCRUD:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# ======================================================
|
# ======================================================
|
||||||
# GSTRelease MULTI-FIELD
|
# SUBCONTRACTOR (MULTI-FIELD)
|
||||||
# ======================================================
|
# ======================================================
|
||||||
if self.itemCRUDType.name == "GSTRelease" and data:
|
if data:
|
||||||
|
|
||||||
cursor.callproc(storedprocupdate, (
|
|
||||||
childid,
|
|
||||||
data['PMC_No'],
|
|
||||||
data['Invoice_No'],
|
|
||||||
data['Basic_Amount'],
|
|
||||||
data['Final_Amount'],
|
|
||||||
data['Total_Amount'],
|
|
||||||
data['UTR'],
|
|
||||||
data['Contractor_ID']
|
|
||||||
))
|
|
||||||
connection.commit()
|
|
||||||
|
|
||||||
self.isSuccess = True
|
|
||||||
self.resultMessage = HtmlHelper.json_response(
|
|
||||||
ResponseHandler.update_success(self.itemCRUDMapping.name), 200
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
# ======================================================
|
|
||||||
# SUBCONTRACTOR MULTI-FIELD
|
|
||||||
# ======================================================
|
|
||||||
if self.itemCRUDType.name == "Subcontractor" and data:
|
|
||||||
|
|
||||||
cursor.callproc(storedprocupdate, (
|
cursor.callproc(storedprocupdate, (
|
||||||
childid,
|
childid,
|
||||||
data['Contractor_Name'],
|
data['Contractor_Name'],
|
||||||
@@ -266,7 +214,9 @@ class ItemCRUD:
|
|||||||
data['GST_No'],
|
data['GST_No'],
|
||||||
data['Contractor_password']
|
data['Contractor_password']
|
||||||
))
|
))
|
||||||
|
|
||||||
connection.commit()
|
connection.commit()
|
||||||
|
|
||||||
self.isSuccess = True
|
self.isSuccess = True
|
||||||
self.resultMessage = HtmlHelper.json_response(
|
self.resultMessage = HtmlHelper.json_response(
|
||||||
ResponseHandler.update_success(self.itemCRUDMapping.name), 200
|
ResponseHandler.update_success(self.itemCRUDMapping.name), 200
|
||||||
@@ -274,7 +224,7 @@ class ItemCRUD:
|
|||||||
return
|
return
|
||||||
|
|
||||||
# ======================================================
|
# ======================================================
|
||||||
# NORMAL SINGLE-FIELD
|
# NORMAL
|
||||||
# ======================================================
|
# ======================================================
|
||||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||||
self.isSuccess = False
|
self.isSuccess = False
|
||||||
@@ -287,6 +237,7 @@ class ItemCRUD:
|
|||||||
cursor.callproc(storedprocupdate, (childid, parentid, childname))
|
cursor.callproc(storedprocupdate, (childid, parentid, childname))
|
||||||
|
|
||||||
connection.commit()
|
connection.commit()
|
||||||
|
|
||||||
self.isSuccess = True
|
self.isSuccess = True
|
||||||
self.resultMessage = ResponseHandler.update_success(self.itemCRUDMapping.name)['message']
|
self.resultMessage = ResponseHandler.update_success(self.itemCRUDMapping.name)['message']
|
||||||
|
|
||||||
@@ -308,15 +259,20 @@ class ItemCRUD:
|
|||||||
|
|
||||||
data = []
|
data = []
|
||||||
connection = config.get_db_connection()
|
connection = config.get_db_connection()
|
||||||
|
|
||||||
if not connection:
|
if not connection:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cursor.callproc(storedproc)
|
cursor.callproc(storedproc)
|
||||||
|
|
||||||
for result in cursor.stored_results():
|
for result in cursor.stored_results():
|
||||||
data = result.fetchall()
|
data = result.fetchall()
|
||||||
|
|
||||||
self.isSuccess = True
|
self.isSuccess = True
|
||||||
|
|
||||||
except mysql.connector.Error as e:
|
except mysql.connector.Error as e:
|
||||||
print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
|
print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
|
||||||
self.isSuccess = False
|
self.isSuccess = False
|
||||||
@@ -324,6 +280,7 @@ class ItemCRUD:
|
|||||||
ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
|
ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
|
||||||
)
|
)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
connection.close()
|
connection.close()
|
||||||
@@ -341,10 +298,13 @@ class ItemCRUD:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
cursor.callproc(storedproc, (id,))
|
cursor.callproc(storedproc, (id,))
|
||||||
|
|
||||||
for rs in cursor.stored_results():
|
for rs in cursor.stored_results():
|
||||||
data = rs.fetchone()
|
data = rs.fetchone()
|
||||||
|
|
||||||
except mysql.connector.Error as e:
|
except mysql.connector.Error as e:
|
||||||
print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
|
print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
connection.close()
|
connection.close()
|
||||||
@@ -393,6 +353,7 @@ class ItemCRUD:
|
|||||||
return HtmlHelper.json_response(
|
return HtmlHelper.json_response(
|
||||||
ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
|
ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
|
||||||
)
|
)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
cursor.close()
|
cursor.close()
|
||||||
connection.close()
|
connection.close()
|
||||||
@@ -8,7 +8,7 @@ class ItemCRUDType(Enum):
|
|||||||
State = 4
|
State = 4
|
||||||
HoldType = 5
|
HoldType = 5
|
||||||
Subcontractor = 6
|
Subcontractor = 6
|
||||||
GSTRelease = 7
|
|
||||||
|
|
||||||
class RegEx:
|
class RegEx:
|
||||||
patternAlphabetOnly = "^[A-Za-z ]+$"
|
patternAlphabetOnly = "^[A-Za-z ]+$"
|
||||||
|
|||||||
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.
@@ -1,8 +1,109 @@
|
|||||||
# model/gst_release.py
|
# from flask import request
|
||||||
|
# from model.ItemCRUD import ItemCRUD
|
||||||
|
# from model.Utilities import ItemCRUDType
|
||||||
|
|
||||||
|
# class GSTRelease:
|
||||||
|
# """CRUD operations for GST Release using ItemCRUD"""
|
||||||
|
|
||||||
|
# def __init__(self):
|
||||||
|
# self.isSuccess = False
|
||||||
|
# self.resultMessage = ""
|
||||||
|
|
||||||
|
# # ------------------- Add GST Release -------------------
|
||||||
|
# def AddGSTRelease(self, request):
|
||||||
|
# pmc_no = request.form.get('PMC_No', '').strip()
|
||||||
|
# invoice_no = request.form.get('invoice_No', '').strip()
|
||||||
|
|
||||||
|
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||||
|
# gst.AddItem(
|
||||||
|
# request=request,
|
||||||
|
# parentid=None,
|
||||||
|
# childname=f"{pmc_no}-{invoice_no}",
|
||||||
|
# storedprocfetch="CheckGSTReleaseExists",
|
||||||
|
# storedprocadd="AddGSTReleaseFromExcel" # your stored procedure handles extra fields
|
||||||
|
# )
|
||||||
|
|
||||||
|
# self.isSuccess = gst.isSuccess
|
||||||
|
# self.resultMessage = str(gst.resultMessage)
|
||||||
|
|
||||||
|
# # ------------------- Get All GST Releases -------------------
|
||||||
|
# def GetAllGSTReleases(self):
|
||||||
|
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||||
|
# # Pass request=None for fetch
|
||||||
|
# rows = gst.GetAllData(request=None, storedproc="GetAllGSTReleases")
|
||||||
|
|
||||||
|
# self.isSuccess = gst.isSuccess
|
||||||
|
# self.resultMessage = str(gst.resultMessage)
|
||||||
|
|
||||||
|
# data = []
|
||||||
|
# for row in rows:
|
||||||
|
# data.append({
|
||||||
|
# "gst_release_id": row[0],
|
||||||
|
# "pmc_no": row[1],
|
||||||
|
# "invoice_no": row[2],
|
||||||
|
# "basic_amount": row[3],
|
||||||
|
# "final_amount": row[4],
|
||||||
|
# "total_amount": row[5],
|
||||||
|
# "utr": row[6],
|
||||||
|
# "contractor_id": row[7]
|
||||||
|
# })
|
||||||
|
# return data
|
||||||
|
|
||||||
|
# # ------------------- Get GST Release By ID -------------------
|
||||||
|
# def GetGSTReleaseByID(self, gst_release_id):
|
||||||
|
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||||
|
# row = gst.GetDataByID(gst_release_id, request=None, storedproc="GetGSTReleaseById")
|
||||||
|
|
||||||
|
# self.isSuccess = gst.isSuccess
|
||||||
|
# self.resultMessage = str(gst.resultMessage)
|
||||||
|
|
||||||
|
# if row:
|
||||||
|
# return {
|
||||||
|
# "gst_release_id": row[0],
|
||||||
|
# "pmc_no": row[1],
|
||||||
|
# "invoice_no": row[2],
|
||||||
|
# "basic_amount": row[3],
|
||||||
|
# "final_amount": row[4],
|
||||||
|
# "total_amount": row[5],
|
||||||
|
# "utr": row[6],
|
||||||
|
# "contractor_id": row[7]
|
||||||
|
# }
|
||||||
|
# return None
|
||||||
|
|
||||||
|
# # ------------------- Edit GST Release -------------------
|
||||||
|
# def EditGSTRelease(self, request, gst_release_id):
|
||||||
|
# pmc_no = request.form.get('PMC_No', '').strip()
|
||||||
|
# invoice_no = request.form.get('invoice_No', '').strip()
|
||||||
|
|
||||||
|
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||||
|
# gst.EditItem(
|
||||||
|
# request=request,
|
||||||
|
# childid=gst_release_id,
|
||||||
|
# parentid=None,
|
||||||
|
# childname=f"{pmc_no}-{invoice_no}",
|
||||||
|
# storedprocupdate="UpdateGSTRelease" # stored procedure handles extra fields
|
||||||
|
# )
|
||||||
|
|
||||||
|
# self.isSuccess = gst.isSuccess
|
||||||
|
# self.resultMessage = str(gst.resultMessage)
|
||||||
|
|
||||||
|
# # ------------------- Delete GST Release -------------------
|
||||||
|
# def DeleteGSTRelease(self, gst_release_id):
|
||||||
|
# gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||||
|
# gst.DeleteItem(
|
||||||
|
# itemID=gst_release_id,
|
||||||
|
# request=None,
|
||||||
|
# storedprocDelete="DeleteGSTReleaseById"
|
||||||
|
# )
|
||||||
|
|
||||||
|
# self.isSuccess = gst.isSuccess
|
||||||
|
# self.resultMessage = str(gst.resultMessage)
|
||||||
|
|
||||||
from flask import request, jsonify
|
from flask import request, jsonify
|
||||||
from model.ItemCRUD import ItemCRUD
|
from model.ItemCRUD import ItemCRUD
|
||||||
from model.Utilities import ItemCRUDType
|
from model.Utilities import ItemCRUDType
|
||||||
|
|
||||||
|
|
||||||
class GSTRelease:
|
class GSTRelease:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -24,7 +125,6 @@ class GSTRelease:
|
|||||||
"Contractor_ID": int(request.form.get("Contractor_ID", 0) or 0)
|
"Contractor_ID": int(request.form.get("Contractor_ID", 0) or 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add GST Release
|
|
||||||
gst.AddItem(
|
gst.AddItem(
|
||||||
request=request,
|
request=request,
|
||||||
data=data,
|
data=data,
|
||||||
@@ -32,12 +132,6 @@ class GSTRelease:
|
|||||||
storedprocadd="AddGSTReleaseFromExcel"
|
storedprocadd="AddGSTReleaseFromExcel"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check if addition was successful
|
|
||||||
if gst.isSuccess:
|
|
||||||
print(f"GST Release Added: {data}")
|
|
||||||
else:
|
|
||||||
print(f"Failed to add GST Release: {gst.resultMessage}")
|
|
||||||
|
|
||||||
self.isSuccess = gst.isSuccess
|
self.isSuccess = gst.isSuccess
|
||||||
self.resultMessage = str(gst.resultMessage)
|
self.resultMessage = str(gst.resultMessage)
|
||||||
|
|
||||||
@@ -104,6 +198,7 @@ class GSTRelease:
|
|||||||
def GetAllGSTReleases(self):
|
def GetAllGSTReleases(self):
|
||||||
try:
|
try:
|
||||||
gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||||
|
|
||||||
rows = gst.GetAllData(None, "GetAllGSTReleases")
|
rows = gst.GetAllData(None, "GetAllGSTReleases")
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
@@ -129,6 +224,7 @@ class GSTRelease:
|
|||||||
def GetGSTReleaseByID(self, gst_release_id):
|
def GetGSTReleaseByID(self, gst_release_id):
|
||||||
try:
|
try:
|
||||||
gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
gst = ItemCRUD(itemType=ItemCRUDType.GSTRelease)
|
||||||
|
|
||||||
row = gst.GetDataByID(gst_release_id, "GetGSTReleaseById")
|
row = gst.GetDataByID(gst_release_id, "GetGSTReleaseById")
|
||||||
|
|
||||||
if row:
|
if row:
|
||||||
|
|||||||
@@ -1,41 +1,37 @@
|
|||||||
|
|
||||||
|
|
||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
|
if (document.getElementById('Village_Name')) {
|
||||||
document.getElementById('Village_Name').focus();
|
document.getElementById('Village_Name').focus();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
|
||||||
// 🔥 RESTORE VIEW MODE AFTER RELOAD
|
// ✅ RUN ONLY IF THIS PAGE HAS FORM/TABLE
|
||||||
var viewMode = localStorage.getItem("viewMode");
|
if ($('#addForm').length && $('#addTable').length) {
|
||||||
|
|
||||||
if (viewMode === "table") {
|
// ✅ DEFAULT VIEW → SHOW FORM
|
||||||
$('#addForm').hide();
|
|
||||||
$('#addTable').show();
|
|
||||||
} else {
|
|
||||||
$('#addForm').show();
|
$('#addForm').show();
|
||||||
$('#addTable').hide();
|
$('#addTable').hide();
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 🔥 BUTTON TOGGLE LOGIC
|
// 🔥 BUTTON TOGGLE
|
||||||
|
|
||||||
$('#addButton').click(function () {
|
$('#addButton').click(function () {
|
||||||
$('#addForm').show();
|
$('#addForm').show();
|
||||||
$('#addTable').hide();
|
$('#addTable').hide();
|
||||||
|
|
||||||
localStorage.setItem("viewMode", "form");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#displayButton').click(function () {
|
$('#displayButton').click(function () {
|
||||||
$('#addForm').hide();
|
$('#addForm').hide();
|
||||||
$('#addTable').show();
|
$('#addTable').show();
|
||||||
|
|
||||||
localStorage.setItem("viewMode", "table");
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ===============================
|
||||||
// STATE → DISTRICT
|
// STATE → DISTRICT
|
||||||
|
// ===============================
|
||||||
|
if ($('#state_Id').length) {
|
||||||
|
|
||||||
$('#state_Id').change(function () {
|
$('#state_Id').change(function () {
|
||||||
|
|
||||||
var stateId = $(this).val();
|
var stateId = $(this).val();
|
||||||
@@ -54,25 +50,24 @@ $(document).ready(function () {
|
|||||||
districtDropdown.append('<option value="" disabled selected>Select District</option>');
|
districtDropdown.append('<option value="" disabled selected>Select District</option>');
|
||||||
|
|
||||||
data.forEach(function (district) {
|
data.forEach(function (district) {
|
||||||
|
|
||||||
districtDropdown.append(
|
districtDropdown.append(
|
||||||
'<option value="' + district.id + '">' + district.name + '</option>'
|
'<option value="' + district.id + '">' + district.name + '</option>'
|
||||||
);
|
);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
districtDropdown.prop('disabled', false);
|
districtDropdown.prop('disabled', false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
// ===============================
|
||||||
// DISTRICT → BLOCK
|
// DISTRICT → BLOCK
|
||||||
|
// ===============================
|
||||||
|
if ($('#district_Id').length) {
|
||||||
|
|
||||||
$('#district_Id').change(function () {
|
$('#district_Id').change(function () {
|
||||||
|
|
||||||
var districtId = $(this).val();
|
var districtId = $(this).val();
|
||||||
@@ -91,25 +86,24 @@ $(document).ready(function () {
|
|||||||
blockDropdown.append('<option value="" disabled selected>Select Block</option>');
|
blockDropdown.append('<option value="" disabled selected>Select Block</option>');
|
||||||
|
|
||||||
data.forEach(function (block) {
|
data.forEach(function (block) {
|
||||||
|
|
||||||
blockDropdown.append(
|
blockDropdown.append(
|
||||||
'<option value="' + block.id + '">' + block.name + '</option>'
|
'<option value="' + block.id + '">' + block.name + '</option>'
|
||||||
);
|
);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
blockDropdown.prop('disabled', false);
|
blockDropdown.prop('disabled', false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
// ===============================
|
||||||
// VILLAGE NAME VALIDATION
|
// VILLAGE NAME VALIDATION
|
||||||
|
// ===============================
|
||||||
|
if ($('#Village_Name').length) {
|
||||||
|
|
||||||
$('#Village_Name').on('input', function () {
|
$('#Village_Name').on('input', function () {
|
||||||
|
|
||||||
var villageName = $(this).val();
|
var villageName = $(this).val();
|
||||||
@@ -127,13 +121,16 @@ $(document).ready(function () {
|
|||||||
|
|
||||||
$('#villageMessage').text('');
|
$('#villageMessage').text('');
|
||||||
$('#submitVillage').prop('disabled', false);
|
$('#submitVillage').prop('disabled', false);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
// ===============================
|
||||||
// CHECK DUPLICATE VILLAGE
|
// CHECK DUPLICATE VILLAGE
|
||||||
|
// ===============================
|
||||||
|
if ($('#Village_Name').length && $('#block_Id').length) {
|
||||||
|
|
||||||
$('#Village_Name, #block_Id').on('change keyup', function () {
|
$('#Village_Name, #block_Id').on('change keyup', function () {
|
||||||
|
|
||||||
var blockId = $('#block_Id').val();
|
var blockId = $('#block_Id').val();
|
||||||
@@ -142,7 +139,6 @@ $(document).ready(function () {
|
|||||||
if (blockId && villageName) {
|
if (blockId && villageName) {
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
|
||||||
url: '/check_village',
|
url: '/check_village',
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
|
|
||||||
@@ -168,9 +164,7 @@ $(document).ready(function () {
|
|||||||
.css('color', 'green');
|
.css('color', 'green');
|
||||||
|
|
||||||
$('#submitVillage').prop('disabled', false);
|
$('#submitVillage').prop('disabled', false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
error: function () {
|
error: function () {
|
||||||
@@ -180,85 +174,77 @@ $(document).ready(function () {
|
|||||||
.css('color', 'red');
|
.css('color', 'red');
|
||||||
|
|
||||||
$('#submitVillage').prop('disabled', true);
|
$('#submitVillage').prop('disabled', true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
// ===============================
|
||||||
|
// ADD VILLAGE (SAFE SCOPE FIX)
|
||||||
|
// ===============================
|
||||||
|
if ($('#villageForm').length) {
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// ADD VILLAGE
|
|
||||||
$('#villageForm').submit(function (event) {
|
$('#villageForm').submit(function (event) {
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
|
||||||
url: '/add_village',
|
url: '/add_village',
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
data: $(this).serialize(),
|
data: $(this).serialize(),
|
||||||
|
|
||||||
success: function (response) {
|
success: function (response) {
|
||||||
|
|
||||||
if (response.status === 'success') {
|
if (response && response.status === 'success') {
|
||||||
|
|
||||||
alert('Village added successfully!');
|
alert(response.message || 'Village added successfully!');
|
||||||
|
|
||||||
|
// ✅ clear form
|
||||||
|
$('#villageForm')[0].reset();
|
||||||
|
|
||||||
|
// ✅ switch to table
|
||||||
|
$('#addForm').hide();
|
||||||
|
$('#addTable').show();
|
||||||
|
|
||||||
|
// optional refresh
|
||||||
location.reload();
|
location.reload();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
alert(response.message || 'Error adding village. Please try again.');
|
alert(response.message || 'Error adding village. Please try again.');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
error: function () {
|
error: function () {
|
||||||
|
|
||||||
alert('An error occurred. Please try again.');
|
alert('An error occurred. Please try again.');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// 🔥 DELETE FUNCTION (UPDATED)
|
|
||||||
function deleteVillage(villageId) {
|
|
||||||
|
|
||||||
if (!confirm("Are you sure you want to delete this village?")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ✅ save that user is on table
|
// ===============================
|
||||||
localStorage.setItem("viewMode", "table");
|
// DELETE FUNCTION (SAFE)
|
||||||
|
// ===============================
|
||||||
|
function deleteVillage(villageId, element) {
|
||||||
|
if (!confirm("Are you sure you want to delete this village?")) return;
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/delete_village/' + villageId,
|
url: '/delete_village/' + villageId,
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
|
dataType: 'json',
|
||||||
success: function () {
|
success: function (response) {
|
||||||
|
alert(response.message); // ✅ now shows "Village deleted successfully!"
|
||||||
setTimeout(function () {
|
if (element) $(element).closest("tr").remove();
|
||||||
|
|
||||||
alert("Village deleted successfully!");
|
|
||||||
|
|
||||||
// reload but stay on table
|
|
||||||
location.reload();
|
|
||||||
|
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
error: function () {
|
error: function () {
|
||||||
alert("Error deleting village. Please try again.");
|
alert("Error deleting village. Please try again.");
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -68,11 +68,10 @@
|
|||||||
{% endwith %}
|
{% endwith %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- GST Release History Table -->
|
|
||||||
<div id="addTable" style="display: none;">
|
<div id="addTable" style="display: none;">
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<h2>GST Release History</h2>
|
<h2>GST Release History</h2>
|
||||||
<input type="text" id="searchBar" placeholder="Search..." onkeyup="searchTable()">
|
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
||||||
</div>
|
</div>
|
||||||
<table id="sortableTable" border="1">
|
<table id="sortableTable" border="1">
|
||||||
<thead>
|
<thead>
|
||||||
@@ -91,22 +90,24 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
{% for gst_rel in gst_releases %}
|
{% for gst_rel in gst_releases %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ gst_rel.gst_release_id }}</td>
|
<td>{{ gst_rel[0] }}</td>
|
||||||
<td>{{ gst_rel.pmc_no }}</td>
|
<td>{{ gst_rel[1] }}</td>
|
||||||
<td>{{ gst_rel.invoice_no }}</td>
|
<td>{{ gst_rel[2] }}</td>
|
||||||
<td>{{ gst_rel.basic_amount }}</td>
|
<td>{{ gst_rel[3] }}</td>
|
||||||
<td>{{ gst_rel.final_amount }}</td>
|
<td>{{ gst_rel[4] }}</td>
|
||||||
<td>{{ gst_rel.total_amount }}</td>
|
<td>{{ gst_rel[5] }}</td>
|
||||||
<td>{{ gst_rel.utr }}</td>
|
<td>{{ gst_rel[6] }}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url_for('gst_release_bp.edit_gst_release', gst_release_id=gst_rel.gst_release_id) }}">
|
<a href="/edit_gst_release/{{ gst_rel[0] }}">
|
||||||
<img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit" class="icon">
|
<img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit"
|
||||||
|
class="icon">
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url_for('gst_release_bp.delete_gst_release', gst_release_id=gst_rel.gst_release_id) }}"
|
<a href="/delete_gst_release/{{ gst_rel[0] }}"
|
||||||
onclick="return confirm('Are you sure you want to delete this GST Release?')">
|
onclick="return confirm('Are you sure you want to delete this GST Release?')">
|
||||||
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete" class="icon">
|
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete"
|
||||||
|
class="icon">
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -1,22 +1,24 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %} {% block content %}
|
||||||
{% block content %}
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Village Management</title>
|
<title>Village Management</title>
|
||||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style.css') }}">
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
type="text/css"
|
||||||
|
href="{{ url_for('static', filename='css/style.css') }}"
|
||||||
|
/>
|
||||||
<script src="{{ url_for('static', filename='js/village.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/village.js') }}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/search_on_table.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/search_on_table.js') }}"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<!-- Button Container to Center Buttons -->
|
||||||
<!-- Button Container to Center Buttons -->
|
<div class="button-container">
|
||||||
<div class="button-container">
|
|
||||||
<button id="addButton" class="action-button">Add</button>
|
<button id="addButton" class="action-button">Add</button>
|
||||||
<button id="displayButton" class="action-button">Display</button>
|
<button id="displayButton" class="action-button">Display</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="addForm" style="display: none;">
|
<div id="addForm" style="display: none">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="form-block">
|
<div class="form-block">
|
||||||
<h2>Add a New Village</h2>
|
<h2>Add a New Village</h2>
|
||||||
@@ -40,19 +42,30 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
<label for="Village_Name">Village Name:</label>
|
<label for="Village_Name">Village Name:</label>
|
||||||
<input type="text" id="Village_Name" name="Village_Name" placeholder="Enter Village Name" required>
|
<input
|
||||||
|
type="text"
|
||||||
|
id="Village_Name"
|
||||||
|
name="Village_Name"
|
||||||
|
placeholder="Enter Village Name"
|
||||||
|
required
|
||||||
|
/>
|
||||||
<span id="villageMessage"></span>
|
<span id="villageMessage"></span>
|
||||||
|
|
||||||
<button type="submit" id="submitVillage" disabled>Add Village</button>
|
<button type="submit" id="submitVillage" disabled>Add Village</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="addTable" style="display: none;">
|
<div id="addTable" style="display: none">
|
||||||
<div class="search-container">
|
<div class="search-container">
|
||||||
<h2>Display Villages</h2>
|
<h2>Display Villages</h2>
|
||||||
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
<input
|
||||||
|
type="text"
|
||||||
|
id="searchBar"
|
||||||
|
placeholder="Searching..."
|
||||||
|
onkeyup="searchTable()"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<table id="sortableTable" border="1">
|
<table id="sortableTable" border="1">
|
||||||
@@ -63,12 +76,15 @@
|
|||||||
<span class="sort-buttons">
|
<span class="sort-buttons">
|
||||||
<span class="sort-asc">⬆️</span>
|
<span class="sort-asc">⬆️</span>
|
||||||
<span class="sort-desc">⬇️</span>
|
<span class="sort-desc">⬇️</span>
|
||||||
</span></th>
|
</span>
|
||||||
<th class="sortable-header">Block Name
|
</th>
|
||||||
|
<th class="sortable-header">
|
||||||
|
Block Name
|
||||||
<span class="sort-buttons">
|
<span class="sort-buttons">
|
||||||
<span class="sort-asc">⬆️</span>
|
<span class="sort-asc">⬆️</span>
|
||||||
<span class="sort-desc">⬇️</span>
|
<span class="sort-desc">⬇️</span>
|
||||||
</span></th>
|
</span>
|
||||||
|
</th>
|
||||||
<th>Update</th>
|
<th>Update</th>
|
||||||
<th>Delete</th>
|
<th>Delete</th>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -78,22 +94,36 @@
|
|||||||
<td>{{ village[1] }}</td>
|
<td>{{ village[1] }}</td>
|
||||||
<td>{{ village[2] }}</td>
|
<td>{{ village[2] }}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url_for('village.edit_village', village_id=village[0]) }}">
|
<a
|
||||||
<img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit"
|
href="{{ url_for('village.edit_village', village_id=village[0]) }}"
|
||||||
class="icon">
|
>
|
||||||
|
<img
|
||||||
|
src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}"
|
||||||
|
alt="Edit"
|
||||||
|
class="icon"
|
||||||
|
/>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="#"
|
<a href="javascript:void(0);"
|
||||||
onclick="deleteVillage({{ village[0] }}); return false;">
|
onclick="deleteVillage({{ village[0] }}, this)">
|
||||||
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}"
|
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}"
|
||||||
alt="Delete" class="icon">
|
class="icon">
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Flash Alerts -->
|
||||||
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||||
|
{% if messages %}
|
||||||
|
<script>
|
||||||
|
{% for category, message in messages %}
|
||||||
|
alert("{{ message }}");
|
||||||
|
{% endfor %}
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
</body>
|
</body>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -28,25 +28,17 @@
|
|||||||
|
|
||||||
<button type="submit">Update Village</button>
|
<button type="submit">Update Village</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
<!-- Flash Messages (hidden, used for JS popup) -->
|
||||||
|
<div id="flash-messages-container" style="display:none;">
|
||||||
<!-- Flash Message (Hidden, used for JS popup) -->
|
|
||||||
{% with messages = get_flashed_messages(with_categories=true) %}
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
||||||
{% if messages %}
|
{% if messages %}
|
||||||
{% for category, message in messages %}
|
{% for category, message in messages %}
|
||||||
<div id="flash-message" data-category="{{ category }}" style="display:none;">{{ message }}</div>
|
<div class="flash-message" data-category="{{ category }}">{{ message }}</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
|
||||||
window.onload = function () {
|
|
||||||
const flash = document.getElementById('flash-message');
|
|
||||||
if (flash && flash.innerText.trim() !== "") {
|
|
||||||
alert(flash.innerText);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user