Merge pull request 'hold type updated , delete done by prajkta' (#13) from pankaj-dev into main
Reviewed-on: #13
This commit was merged in pull request #13.
This commit is contained in:
@@ -10,21 +10,21 @@ hold_bp = Blueprint("hold_types", __name__)
|
||||
@hold_bp.route('/add_hold_type', methods=['GET','POST'])
|
||||
@login_required
|
||||
def add_hold_type():
|
||||
|
||||
hold = HoldTypes()
|
||||
|
||||
if request.method == 'POST':
|
||||
hold.AddHoldType(request) # ✅
|
||||
return hold.resultMessage
|
||||
hold.AddHoldType(request)
|
||||
# ✅ Always redirect to same page (NO JSON)
|
||||
return redirect(url_for("hold_types.add_hold_type"))
|
||||
|
||||
hold_types = hold.GetAllHoldTypes() # ✅
|
||||
# GET request → show data
|
||||
hold_types = hold.GetAllHoldTypes()
|
||||
|
||||
return render_template(
|
||||
"add_hold_type.html",
|
||||
Hold_Types_data=hold_types
|
||||
)
|
||||
|
||||
|
||||
# ---------------- CHECK HOLD TYPE (OPTIONAL LIKE BLOCK) ----------------
|
||||
@hold_bp.route('/check_hold_type', methods=['POST'])
|
||||
@login_required
|
||||
|
||||
@@ -135,7 +135,7 @@ class ItemCRUD:
|
||||
# ======================================================
|
||||
# NORMAL (Village / Block / State)
|
||||
# ======================================================
|
||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||
if not re.match(RegEx.allPattern, childname):
|
||||
self.isSuccess = False
|
||||
self.resultMessage = HtmlHelper.json_response(
|
||||
ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
||||
@@ -226,7 +226,7 @@ class ItemCRUD:
|
||||
# ======================================================
|
||||
# NORMAL
|
||||
# ======================================================
|
||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||
if not re.match(RegEx.allPattern, childname):
|
||||
self.isSuccess = False
|
||||
self.resultMessage = ResponseHandler.update_failure(self.itemCRUDMapping.name)['message']
|
||||
return
|
||||
@@ -324,7 +324,7 @@ class ItemCRUD:
|
||||
f"User {current_user.id} checked '{childname}'"
|
||||
)
|
||||
|
||||
if not re.match(RegEx.patternAlphabetOnly, childname):
|
||||
if not re.match(RegEx.allPattern, childname):
|
||||
return HtmlHelper.json_response(
|
||||
ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
|
||||
)
|
||||
|
||||
@@ -12,6 +12,7 @@ class ItemCRUDType(Enum):
|
||||
|
||||
class RegEx:
|
||||
patternAlphabetOnly = "^[A-Za-z ]+$"
|
||||
allPattern = "^(?!\s*$).+"
|
||||
|
||||
|
||||
class ResponseHandler:
|
||||
|
||||
@@ -3,7 +3,7 @@ $(document).ready(function () {
|
||||
let holdType = $(this).val().replace(/^\s+/, "");
|
||||
$(this).val(holdType);
|
||||
|
||||
let reg = /^[A-Za-z]/;
|
||||
let reg = /^.+$/; // all pattern allow
|
||||
|
||||
if (!reg.test(holdType)) {
|
||||
$("#holdTypeMessage").text("Hold Type must start with a letter.").css("color", "red");
|
||||
|
||||
@@ -1,59 +1,73 @@
|
||||
{% extends 'base.html' %}
|
||||
{% block content %}
|
||||
|
||||
<head>
|
||||
<title>Manage Hold Types</title>
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<!-- <script src="{{ url_for('static', filename='js/hold_types.js') }}"></script> -->
|
||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style.css') }}">
|
||||
<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>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="button-container">
|
||||
<button id="addButton" class="action-button">Add</button>
|
||||
<button id="displayButton" class="action-button">Display</button>
|
||||
</div>
|
||||
<div class="button-container">
|
||||
<button id="addButton" class="action-button">Add</button>
|
||||
<button id="displayButton" class="action-button">Display</button>
|
||||
</div>
|
||||
|
||||
<div id="addForm">
|
||||
<h2>Add Hold Types</h2>
|
||||
<form id="holdTypeForm" method="POST" action="{{ url_for('hold_types.add_hold_type') }}">
|
||||
<label>Enter Hold Amount Type:</label>
|
||||
<input type="text" id="hold_type" name="hold_type" placeholder="Enter Type" required>
|
||||
<span id="holdTypeMessage"></span>
|
||||
<button type="submit" value="Add Hold Type" id="successPopup">Add Hold Type</button>
|
||||
</form>
|
||||
</div>
|
||||
<div id="addForm">
|
||||
<h2>Add Hold Types</h2>
|
||||
<form id="holdTypeForm" method="POST" action="{{ url_for('hold_types.add_hold_type') }}">
|
||||
<label>Enter Hold Amount Type:</label>
|
||||
<input type="text" id="hold_type" name="hold_type" placeholder="Enter Type" required>
|
||||
<span id="holdTypeMessage"></span>
|
||||
<button type="submit" value="Add Hold Type" id="successPopup">Add Hold Type</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="addTable" style="display: none;">
|
||||
<div class="search-container">
|
||||
<h2>Hold Type List</h2>
|
||||
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
||||
</div>
|
||||
<table id="sortableTable" border="1">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th class="sortable-header">
|
||||
Hold Type
|
||||
<span class="sort-buttons">
|
||||
<span class="sort-asc">⬆️</span>
|
||||
<span class="sort-desc">⬇️</span>
|
||||
</span>
|
||||
</th>
|
||||
<th>Update</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
{% for htd in Hold_Types_data %}
|
||||
<tr>
|
||||
<td>{{ htd['hold_type_id'] }}</td>
|
||||
<td>{{ htd['hold_type'] }}</td>
|
||||
<td><a href="{{ url_for('hold_types.edit_hold_type', id=htd['hold_type_id']) }}">Edit</a></td>
|
||||
<td><button class="delete-button" data-id="{{ htd['hold_type_id'] }}">Delete</button></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
<div id="addTable" style="display: none;">
|
||||
<div class="search-container">
|
||||
<h2>Hold Type List</h2>
|
||||
<input type="text" id="searchBar" placeholder="Searching..." onkeyup="searchTable()">
|
||||
</div>
|
||||
<table id="sortableTable" border="1">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th class="sortable-header">
|
||||
Hold Type
|
||||
<span class="sort-buttons">
|
||||
<span class="sort-asc">⬆️</span>
|
||||
<span class="sort-desc">⬇️</span>
|
||||
</span>
|
||||
</th>
|
||||
<th>Update</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
{% for htd in Hold_Types_data %}
|
||||
<tr>
|
||||
<td>{{ htd['hold_type_id'] }}</td>
|
||||
<td>{{ htd['hold_type'] }}</td>
|
||||
<td style="text-align:center;">
|
||||
<a href="{{ url_for('hold_types.edit_hold_type', id=htd['hold_type_id']) }}">
|
||||
<img src="{{ url_for('static', filename='images/icons/pen_blue_icon.png') }}" alt="Edit"
|
||||
class="icon">
|
||||
</a>
|
||||
</td>
|
||||
|
||||
<a href="/">Back to Dashboard</a>
|
||||
</div>
|
||||
<td style="text-align:center;">
|
||||
<a href="{{ url_for('hold_types.delete_hold_type', id=htd['hold_type_id']) }}"
|
||||
onclick="return confirm('Are you sure you want to delete this hold type?');">
|
||||
|
||||
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete"
|
||||
class="icon">
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<a href="/">Back to Dashboard</a>
|
||||
</div>
|
||||
</body>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<head>
|
||||
<title>Edit Hold Type</title>
|
||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style.css') }}">
|
||||
@@ -10,10 +10,10 @@
|
||||
|
||||
<body>
|
||||
<h2>Edit Hold Type</h2>
|
||||
<form id="updateHoldTypeForm">
|
||||
<input type="hidden" id="hold_type_id" value="{{ hold_type[0] }}">
|
||||
<form id="updateHoldTypeForm" method="POST">
|
||||
<input type="hidden" id="hold_type_id" value="{{ hold_type.hold_type_id }}">
|
||||
<label for="edit_hold_type">Hold Type:</label>
|
||||
<input type="text" id="edit_hold_type" name="hold_type" value="{{ hold_type[1] }}" required>
|
||||
<input type="text" id="edit_hold_type" name="hold_type" value="{{ hold_type.hold_type }}" required>
|
||||
<button type="submit">Update</button>
|
||||
<a href="{{ url_for('hold_types.add_hold_type') }}"></a>
|
||||
</form>
|
||||
@@ -37,7 +37,7 @@
|
||||
formData.append('hold_type', newHoldType);
|
||||
|
||||
$.ajax({
|
||||
url: '/update_hold_type/' + holdTypeId,
|
||||
url: '/edit_hold_type/' + holdTypeId,
|
||||
method: 'POST',
|
||||
data: formData,
|
||||
processData: false,
|
||||
@@ -55,8 +55,3 @@
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
{% block content %}
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Edit Invoice</title>
|
||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/invoice.css') }}">
|
||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/style1.css') }}">
|
||||
@@ -12,158 +12,174 @@
|
||||
|
||||
<body>
|
||||
|
||||
<div id="editForm">
|
||||
<h2>Edit Invoice</h2>
|
||||
<div id="editForm">
|
||||
<h2>Edit Invoice</h2>
|
||||
|
||||
<!-- Success Alert Box -->
|
||||
<div id="invoiceSuccessAlert" class="success-alert" style="display:none;">
|
||||
Invoice successfully updated!
|
||||
<!-- Success Alert Box -->
|
||||
<div id="invoiceSuccessAlert" class="success-alert" style="display:none;">
|
||||
Invoice successfully updated!
|
||||
</div>
|
||||
|
||||
<form id="invoiceForm" action="{{ url_for('invoice.edit_invoice', invoice_id=invoice.Invoice_Id) }}"
|
||||
method="POST">
|
||||
|
||||
<!-- Subcontractor Field -->
|
||||
<div class="row1">
|
||||
<div>
|
||||
<label for="subcontractor">Subcontractor Name:</label>
|
||||
<input class="form-control" list="subcontractor_list" id="subcontractor" name="subcontractor"
|
||||
value="{{ invoice.Contractor_Name }}" placeholder="Type to search..." required>
|
||||
<input type="hidden" id="subcontractor_id" name="subcontractor_id"
|
||||
value="{{ invoice.Subcontractor_Id }}">
|
||||
<datalist id="subcontractor_list"></datalist>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Village and PMC No Fields -->
|
||||
<div class="row2">
|
||||
<div>
|
||||
<label for="village">Village Name:</label>
|
||||
<input type="text" id="village" name="village" value="{{ invoice.Village_Name }}" required />
|
||||
<datalist id="village_list"></datalist>
|
||||
</div>
|
||||
<div>
|
||||
<label for="pmc_no">PMC No:</label>
|
||||
<input type="text" id="pmc_no" name="pmc_no" value="{{ invoice.PMC_No }}" required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Work Type and Invoice Details -->
|
||||
<div class="row2">
|
||||
<div>
|
||||
<label for="work_type">Work Type:</label>
|
||||
<input type="text" id="work_type" name="work_type" value="{{ invoice.Work_Type }}" required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="invoice_details">Invoice Details:</label>
|
||||
<textarea id="invoice_details" name="invoice_details"
|
||||
required>{{ invoice.Invoice_Details }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Invoice No and Invoice Date -->
|
||||
<div class="row2">
|
||||
<div>
|
||||
<label for="invoice_no">Invoice No:</label>
|
||||
<input type="text" id="invoice_no" name="invoice_no" value="{{ invoice.invoice_no }}" required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="invoice_date">Invoice Date:</label>
|
||||
<input type="date" id="invoice_date" name="invoice_date" value="{{ invoice.Invoice_Date }}"
|
||||
required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Amount Fields -->
|
||||
<div class="row3">
|
||||
<div>
|
||||
<label for="basic_amount">Basic Amount:</label>
|
||||
<input type="number" step="0.01" id="basic_amount" name="basic_amount"
|
||||
value="{{ invoice.Basic_Amount }}" required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="debit_amount">Debit Amount:</label>
|
||||
<input type="number" step="0.01" id="debit_amount" name="debit_amount"
|
||||
value="{{ invoice.Debit_Amount }}" required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="after_debit_amount">After Debit Amount:</label>
|
||||
<input type="number" step="0.01" id="after_debit_amount" name="after_debit_amount"
|
||||
value="{{ invoice.After_Debit_Amount }}" required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- GST, TDS, and Other Amounts -->
|
||||
<div class="row3">
|
||||
<div>
|
||||
<label for="amount">Amount:</label>
|
||||
<input type="number" step="0.01" id="amount" name="amount" value="{{ invoice.Amount }}" required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="gst_amount">GST Amount:</label>
|
||||
<input type="number" step="0.01" id="gst_amount" name="gst_amount" value="{{ invoice.GST_Amount }}"
|
||||
required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="tds_amount">TDS Amount:</label>
|
||||
<input type="number" step="0.01" id="tds_amount" name="tds_amount" value="{{ invoice.TDS_Amount }}"
|
||||
required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- SD, On Commission, Hydro Testing -->
|
||||
<div class="row3">
|
||||
<div>
|
||||
<label for="sd_amount">SD Amount:</label>
|
||||
<input type="number" step="0.01" id="sd_amount" name="sd_amount" value="{{ invoice.SD_Amount }}"
|
||||
required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="on_commission">On Commission:</label>
|
||||
<input type="number" step="0.01" id="on_commission" name="on_commission"
|
||||
value="{{ invoice.On_Commission }}" required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="hydro_testing">Hydro Testing:</label>
|
||||
<input type="number" step="0.01" id="hydro_testing" name="hydro_testing"
|
||||
value="{{ invoice.Hydro_Testing }}" required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Hold Amount Section -->
|
||||
<div id="hold_amount_container">
|
||||
{% set seen_types = [] %}
|
||||
{% for hold in invoice.hold_amounts %}
|
||||
{% if hold.hold_type not in seen_types %}
|
||||
{% set _ = seen_types.append(hold.hold_type) %}
|
||||
<div class="hold-amount-row">
|
||||
<label for="hold_type_{{ loop.index }}">Hold Type:</label>
|
||||
<input type="text" id="hold_type_{{ loop.index }}" name="hold_type[]" value="{{ hold.hold_type }}"
|
||||
required />
|
||||
<label for="hold_amount_{{ loop.index }}">Hold Amount:</label>
|
||||
<input type="number" step="0.01" id="hold_amount_{{ loop.index }}" name="hold_amount[]"
|
||||
value="{{ hold.hold_amount }}" required />
|
||||
<button type="button" class="remove-hold-amount">Remove</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="hold-row">
|
||||
<button type="button" id="add_hold_amount" class="button">+ Add Hold Amount</button>
|
||||
</div>
|
||||
|
||||
<!-- Final Amounts -->
|
||||
<div class="row2">
|
||||
<div>
|
||||
<label for="gst_sd_amount">GST SD Amount:</label>
|
||||
<input type="number" step="0.01" id="gst_sd_amount" name="gst_sd_amount"
|
||||
value="{{ invoice.GST_SD_Amount }}" required />
|
||||
</div>
|
||||
<div>
|
||||
<label for="final_amount">Final Amount:</label>
|
||||
<input type="number" step="0.01" id="final_amount" name="final_amount"
|
||||
value="{{ invoice.Final_Amount }}" required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Submit Button -->
|
||||
<button type="submit" class="button">Update</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<form id="invoiceForm" action="{{ url_for('invoice.edit_invoice', invoice_id=invoice.Invoice_Id) }}" method="POST">
|
||||
|
||||
<!-- Subcontractor Field -->
|
||||
<div class="row1">
|
||||
<div>
|
||||
<label for="subcontractor">Subcontractor Name:</label>
|
||||
<input class="form-control" list="subcontractor_list" id="subcontractor" name="subcontractor"
|
||||
value="{{ invoice.Contractor_Name }}" placeholder="Type to search..." required>
|
||||
<input type="hidden" id="subcontractor_id" name="subcontractor_id" value="{{ invoice.Subcontractor_Id }}">
|
||||
<datalist id="subcontractor_list"></datalist>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Village and PMC No Fields -->
|
||||
<div class="row2">
|
||||
<div>
|
||||
<label for="village">Village Name:</label>
|
||||
<input type="text" id="village" name="village" value="{{ invoice.Village_Name }}" required/>
|
||||
<datalist id="village_list"></datalist>
|
||||
</div>
|
||||
<div>
|
||||
<label for="pmc_no">PMC No:</label>
|
||||
<input type="text" id="pmc_no" name="pmc_no" value="{{ invoice.PMC_No }}" required/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Work Type and Invoice Details -->
|
||||
<div class="row2">
|
||||
<div>
|
||||
<label for="work_type">Work Type:</label>
|
||||
<input type="text" id="work_type" name="work_type" value="{{ invoice.Work_Type }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="invoice_details">Invoice Details:</label>
|
||||
<textarea id="invoice_details" name="invoice_details" required>{{ invoice.Invoice_Details }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Invoice No and Invoice Date -->
|
||||
<div class="row2">
|
||||
<div>
|
||||
<label for="invoice_no">Invoice No:</label>
|
||||
<input type="text" id="invoice_no" name="invoice_no" value="{{ invoice.Invoice_No }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="invoice_date">Invoice Date:</label>
|
||||
<input type="date" id="invoice_date" name="invoice_date" value="{{ invoice.Invoice_Date }}" required/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Amount Fields -->
|
||||
<div class="row3">
|
||||
<div>
|
||||
<label for="basic_amount">Basic Amount:</label>
|
||||
<input type="number" step="0.01" id="basic_amount" name="basic_amount" value="{{ invoice.Basic_Amount }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="debit_amount">Debit Amount:</label>
|
||||
<input type="number" step="0.01" id="debit_amount" name="debit_amount" value="{{ invoice.Debit_Amount }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="after_debit_amount">After Debit Amount:</label>
|
||||
<input type="number" step="0.01" id="after_debit_amount" name="after_debit_amount" value="{{ invoice.After_Debit_Amount }}" required/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- GST, TDS, and Other Amounts -->
|
||||
<div class="row3">
|
||||
<div>
|
||||
<label for="amount">Amount:</label>
|
||||
<input type="number" step="0.01" id="amount" name="amount" value="{{ invoice.Amount }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="gst_amount">GST Amount:</label>
|
||||
<input type="number" step="0.01" id="gst_amount" name="gst_amount" value="{{ invoice.GST_Amount }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="tds_amount">TDS Amount:</label>
|
||||
<input type="number" step="0.01" id="tds_amount" name="tds_amount" value="{{ invoice.TDS_Amount }}" required/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- SD, On Commission, Hydro Testing -->
|
||||
<div class="row3">
|
||||
<div>
|
||||
<label for="sd_amount">SD Amount:</label>
|
||||
<input type="number" step="0.01" id="sd_amount" name="sd_amount" value="{{ invoice.SD_Amount }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="on_commission">On Commission:</label>
|
||||
<input type="number" step="0.01" id="on_commission" name="on_commission" value="{{ invoice.On_Commission }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="hydro_testing">Hydro Testing:</label>
|
||||
<input type="number" step="0.01" id="hydro_testing" name="hydro_testing" value="{{ invoice.Hydro_Testing }}" required/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Hold Amount Section -->
|
||||
<div id="hold_amount_container">
|
||||
{% set seen_types = [] %}
|
||||
{% for hold in invoice.hold_amounts %}
|
||||
{% if hold.hold_type not in seen_types %}
|
||||
{% set _ = seen_types.append(hold.hold_type) %}
|
||||
<div class="hold-amount-row">
|
||||
<label for="hold_type_{{ loop.index }}">Hold Type:</label>
|
||||
<input type="text" id="hold_type_{{ loop.index }}" name="hold_type[]" value="{{ hold.hold_type }}" required/>
|
||||
<label for="hold_amount_{{ loop.index }}">Hold Amount:</label>
|
||||
<input type="number" step="0.01" id="hold_amount_{{ loop.index }}" name="hold_amount[]" value="{{ hold.hold_amount }}" required/>
|
||||
<button type="button" class="remove-hold-amount">Remove</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="hold-row">
|
||||
<button type="button" id="add_hold_amount" class="button">+ Add Hold Amount</button>
|
||||
</div>
|
||||
|
||||
<!-- Final Amounts -->
|
||||
<div class="row2">
|
||||
<div>
|
||||
<label for="gst_sd_amount">GST SD Amount:</label>
|
||||
<input type="number" step="0.01" id="gst_sd_amount" name="gst_sd_amount" value="{{ invoice.GST_SD_Amount }}" required/>
|
||||
</div>
|
||||
<div>
|
||||
<label for="final_amount">Final Amount:</label>
|
||||
<input type="number" step="0.01" id="final_amount" name="final_amount" value="{{ invoice.Final_Amount }}" required/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Submit Button -->
|
||||
<button type="submit" class="button">Update</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- JS for dynamic hold amount rows -->
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Add new hold amount row
|
||||
$("#add_hold_amount").click(function() {
|
||||
const index = $("#hold_amount_container .hold-amount-row").length;
|
||||
const newRow = `
|
||||
<!-- JS for dynamic hold amount rows -->
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
// Add new hold amount row
|
||||
$("#add_hold_amount").click(function () {
|
||||
const index = $("#hold_amount_container .hold-amount-row").length;
|
||||
const newRow = `
|
||||
<div class="hold-amount-row">
|
||||
<label for="hold_type_${index}">Hold Type:</label>
|
||||
<input type="text" id="hold_type_${index}" name="hold_type[]" required/>
|
||||
@@ -172,36 +188,36 @@ $(document).ready(function() {
|
||||
<button type="button" class="remove-hold-amount">Remove</button>
|
||||
</div>
|
||||
`;
|
||||
$("#hold_amount_container").append(newRow);
|
||||
});
|
||||
$("#hold_amount_container").append(newRow);
|
||||
});
|
||||
|
||||
// Remove hold amount row
|
||||
$(document).on("click", ".remove-hold-amount", function() {
|
||||
$(this).closest(".hold-amount-row").remove();
|
||||
});
|
||||
// Remove hold amount row
|
||||
$(document).on("click", ".remove-hold-amount", function () {
|
||||
$(this).closest(".hold-amount-row").remove();
|
||||
});
|
||||
|
||||
// Submit form via AJAX
|
||||
$("#invoiceForm").submit(function(e) {
|
||||
e.preventDefault();
|
||||
// Submit form via AJAX
|
||||
$("#invoiceForm").submit(function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: $(this).attr("action"),
|
||||
data: $(this).serialize(),
|
||||
success: function(response) {
|
||||
if(response.status === "success") {
|
||||
$("#invoiceSuccessAlert").fadeIn().delay(3000).fadeOut();
|
||||
alert("Invoice updated successfully!"); // <-- Popup alert
|
||||
}
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: $(this).attr("action"),
|
||||
data: $(this).serialize(),
|
||||
success: function (response) {
|
||||
if (response.status === "success") {
|
||||
$("#invoiceSuccessAlert").fadeIn().delay(3000).fadeOut();
|
||||
alert("Invoice updated successfully!"); // <-- Popup alert
|
||||
}
|
||||
|
||||
},
|
||||
error: function(xhr) {
|
||||
alert("Error: " + xhr.responseJSON.message);
|
||||
}
|
||||
},
|
||||
error: function (xhr) {
|
||||
alert("Error: " + xhr.responseJSON.message);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
||||
</body>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user