Compare commits
4 Commits
5106686a12
...
3888e6d536
Author | SHA1 | Date | |
---|---|---|---|
3888e6d536 | |||
d063d7fb7f | |||
70e7782918 | |||
785fdb6dbb |
@ -1,5 +1,5 @@
|
|||||||
[tool.bumpversion]
|
[tool.bumpversion]
|
||||||
current_version = "1.4.6"
|
current_version = "1.4.7"
|
||||||
commit = true
|
commit = true
|
||||||
tag = true
|
tag = true
|
||||||
tag_name = "{new_version}"
|
tag_name = "{new_version}"
|
||||||
|
80
app.py
80
app.py
@ -107,7 +107,7 @@ def index() -> Union[Response, str]:
|
|||||||
@app.route('/vapid-public-key', methods=['GET'])
|
@app.route('/vapid-public-key', methods=['GET'])
|
||||||
def proxy_vapid_public_key():
|
def proxy_vapid_public_key():
|
||||||
"""Proxies the request for the VAPID public key to the backend."""
|
"""Proxies the request for the VAPID public key to the backend."""
|
||||||
backend_url = f"{app.config['BASE_URL']}/vapid-public-key"
|
backend_url = f"{app.config['BACKEND_URL']}/vapid-public-key"
|
||||||
try:
|
try:
|
||||||
response = requests.get(backend_url)
|
response = requests.get(backend_url)
|
||||||
return Response(response.content, status=response.status_code, mimetype=response.headers['Content-Type'])
|
return Response(response.content, status=response.status_code, mimetype=response.headers['Content-Type'])
|
||||||
@ -120,7 +120,7 @@ def proxy_save_subscription():
|
|||||||
if not session.get("logged_in"):
|
if not session.get("logged_in"):
|
||||||
return jsonify({'error': 'Unauthorized'}), 401
|
return jsonify({'error': 'Unauthorized'}), 401
|
||||||
|
|
||||||
backend_url = f"{app.config['BASE_URL']}/save-subscription"
|
backend_url = f"{app.config['BACKEND_URL']}/save-subscription"
|
||||||
credentials = base64.b64decode(session["auth_credentials"]).decode()
|
credentials = base64.b64decode(session["auth_credentials"]).decode()
|
||||||
username, password = credentials.split(":", 1)
|
username, password = credentials.split(":", 1)
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ def send_test_notification():
|
|||||||
if not session.get("logged_in"):
|
if not session.get("logged_in"):
|
||||||
return jsonify({'error': 'Unauthorized'}), 401
|
return jsonify({'error': 'Unauthorized'}), 401
|
||||||
|
|
||||||
backend_url = f"{app.config['BASE_URL']}/send-test-notification"
|
backend_url = f"{app.config['BACKEND_URL']}/send-test-notification"
|
||||||
credentials = base64.b64decode(session["auth_credentials"]).decode()
|
credentials = base64.b64decode(session["auth_credentials"]).decode()
|
||||||
username, password = credentials.split(":", 1)
|
username, password = credentials.split(":", 1)
|
||||||
|
|
||||||
@ -159,7 +159,7 @@ def send_test_notification():
|
|||||||
def home() -> str:
|
def home() -> str:
|
||||||
"""Renders the home page with account statistics."""
|
"""Renders the home page with account statistics."""
|
||||||
if session.get("logged_in"):
|
if session.get("logged_in"):
|
||||||
base_url = app.config["BASE_URL"]
|
base_url = app.config["BACKEND_URL"]
|
||||||
all_accounts = get_user_accounts(base_url, session["auth_credentials"])
|
all_accounts = get_user_accounts(base_url, session["auth_credentials"])
|
||||||
return render_template(
|
return render_template(
|
||||||
"home.html",
|
"home.html",
|
||||||
@ -177,7 +177,7 @@ def login() -> Union[Response, str]:
|
|||||||
password = request.form["password"]
|
password = request.form["password"]
|
||||||
credentials = f"{username}:{password}"
|
credentials = f"{username}:{password}"
|
||||||
encoded_credentials = base64.b64encode(credentials.encode()).decode()
|
encoded_credentials = base64.b64encode(credentials.encode()).decode()
|
||||||
base_url = app.config["BASE_URL"]
|
base_url = app.config["BACKEND_URL"]
|
||||||
login_url = f"{base_url}/Login"
|
login_url = f"{base_url}/Login"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -205,7 +205,7 @@ def urls() -> Union[Response, str]:
|
|||||||
"""Renders the URLs page."""
|
"""Renders the URLs page."""
|
||||||
if not session.get("logged_in"):
|
if not session.get("logged_in"):
|
||||||
return redirect(url_for("home"))
|
return redirect(url_for("home"))
|
||||||
base_url = app.config["BASE_URL"]
|
base_url = app.config["BACKEND_URL"]
|
||||||
return render_template(
|
return render_template(
|
||||||
"urls.html", urls=get_urls(base_url, session["auth_credentials"])
|
"urls.html", urls=get_urls(base_url, session["auth_credentials"])
|
||||||
)
|
)
|
||||||
@ -216,7 +216,7 @@ def user_accounts() -> Union[Response, str]:
|
|||||||
"""Renders the user accounts page."""
|
"""Renders the user accounts page."""
|
||||||
if not session.get("logged_in"):
|
if not session.get("logged_in"):
|
||||||
return redirect(url_for("home"))
|
return redirect(url_for("home"))
|
||||||
base_url = app.config["BASE_URL"]
|
base_url = app.config["BACKEND_URL"]
|
||||||
user_accounts_data = get_user_accounts(base_url, session["auth_credentials"])
|
user_accounts_data = get_user_accounts(base_url, session["auth_credentials"])
|
||||||
return render_template(
|
return render_template(
|
||||||
"user_accounts.html",
|
"user_accounts.html",
|
||||||
@ -238,7 +238,7 @@ def add_account() -> Union[Response, str]:
|
|||||||
"""Handles adding a new user account."""
|
"""Handles adding a new user account."""
|
||||||
if not session.get("logged_in"):
|
if not session.get("logged_in"):
|
||||||
return redirect(url_for("index", next=request.url))
|
return redirect(url_for("index", next=request.url))
|
||||||
base_url = app.config["BASE_URL"]
|
base_url = app.config["BACKEND_URL"]
|
||||||
shared_text = request.args.get('shared_text')
|
shared_text = request.args.get('shared_text')
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
@ -262,7 +262,7 @@ def delete_account() -> Response:
|
|||||||
"""Handles deleting a user account."""
|
"""Handles deleting a user account."""
|
||||||
stream = request.form.get("stream")
|
stream = request.form.get("stream")
|
||||||
username = request.form.get("username")
|
username = request.form.get("username")
|
||||||
base_url = app.config["BASE_URL"]
|
base_url = app.config["BACKEND_URL"]
|
||||||
delete_user_account(base_url, session["auth_credentials"], stream, username)
|
delete_user_account(base_url, session["auth_credentials"], stream, username)
|
||||||
cache.delete_memoized(user_accounts, key_prefix=make_cache_key)
|
cache.delete_memoized(user_accounts, key_prefix=make_cache_key)
|
||||||
return redirect(url_for("user_accounts"))
|
return redirect(url_for("user_accounts"))
|
||||||
@ -270,7 +270,7 @@ def delete_account() -> Response:
|
|||||||
@app.route("/validateAccount", methods=["POST"])
|
@app.route("/validateAccount", methods=["POST"])
|
||||||
def validate_account() -> Tuple[Response, int]:
|
def validate_account() -> Tuple[Response, int]:
|
||||||
"""Forwards account validation requests to the backend."""
|
"""Forwards account validation requests to the backend."""
|
||||||
base_url = app.config["BASE_URL"]
|
base_url = app.config["BACKEND_URL"]
|
||||||
validate_url = f"{base_url}/validateAccount"
|
validate_url = f"{base_url}/validateAccount"
|
||||||
credentials = base64.b64decode(session["auth_credentials"]).decode()
|
credentials = base64.b64decode(session["auth_credentials"]).decode()
|
||||||
username, password = credentials.split(":", 1)
|
username, password = credentials.split(":", 1)
|
||||||
@ -294,7 +294,7 @@ def stream_names() -> Union[Response, str]:
|
|||||||
"""Fetches and returns stream names as JSON."""
|
"""Fetches and returns stream names as JSON."""
|
||||||
if not session.get("logged_in"):
|
if not session.get("logged_in"):
|
||||||
return redirect(url_for("home"))
|
return redirect(url_for("home"))
|
||||||
base_url = app.config["BASE_URL"]
|
base_url = app.config["BACKEND_URL"]
|
||||||
return jsonify(get_stream_names(base_url, session["auth_credentials"]))
|
return jsonify(get_stream_names(base_url, session["auth_credentials"]))
|
||||||
|
|
||||||
|
|
||||||
@ -323,7 +323,7 @@ def check_expiring_accounts():
|
|||||||
if not session.get("config_logged_in"):
|
if not session.get("config_logged_in"):
|
||||||
return jsonify({'error': 'Unauthorized'}), 401
|
return jsonify({'error': 'Unauthorized'}), 401
|
||||||
|
|
||||||
backend_url = f"{app.config['BASE_URL']}/check-expiry"
|
backend_url = f"{app.config['BACKEND_URL']}/check-expiry"
|
||||||
try:
|
try:
|
||||||
response = requests.post(backend_url)
|
response = requests.post(backend_url)
|
||||||
return Response(response.content, status=response.status_code, mimetype=response.headers['Content-Type'])
|
return Response(response.content, status=response.status_code, mimetype=response.headers['Content-Type'])
|
||||||
@ -331,6 +331,62 @@ def check_expiring_accounts():
|
|||||||
return jsonify({"error": str(e)}), 502
|
return jsonify({"error": str(e)}), 502
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/dns', methods=['GET', 'POST', 'DELETE'])
|
||||||
|
def proxy_dns():
|
||||||
|
"""Proxies DNS management requests to the backend."""
|
||||||
|
if not session.get("config_logged_in"):
|
||||||
|
return jsonify({'error': 'Unauthorized'}), 401
|
||||||
|
|
||||||
|
backend_url = f"{app.config['BACKEND_URL']}/dns"
|
||||||
|
credentials = base64.b64decode(session["auth_credentials"]).decode()
|
||||||
|
username, password = credentials.split(":", 1)
|
||||||
|
auth = requests.auth.HTTPBasicAuth(username, password)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if request.method == 'GET':
|
||||||
|
response = requests.get(backend_url, auth=auth)
|
||||||
|
elif request.method == 'POST':
|
||||||
|
response = requests.post(backend_url, auth=auth, json=request.get_json())
|
||||||
|
if response.ok:
|
||||||
|
cache.clear()
|
||||||
|
elif request.method == 'DELETE':
|
||||||
|
response = requests.delete(backend_url, auth=auth, json=request.get_json())
|
||||||
|
if response.ok:
|
||||||
|
cache.clear()
|
||||||
|
|
||||||
|
return Response(response.content, status=response.status_code, mimetype=response.headers['Content-Type'])
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
return jsonify({"error": str(e)}), 502
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/extra_urls', methods=['GET', 'POST', 'DELETE'])
|
||||||
|
def proxy_extra_urls():
|
||||||
|
"""Proxies extra URL management requests to the backend."""
|
||||||
|
if not session.get("config_logged_in"):
|
||||||
|
return jsonify({'error': 'Unauthorized'}), 401
|
||||||
|
|
||||||
|
backend_url = f"{app.config['BACKEND_URL']}/extra_urls"
|
||||||
|
credentials = base64.b64decode(session["auth_credentials"]).decode()
|
||||||
|
username, password = credentials.split(":", 1)
|
||||||
|
auth = requests.auth.HTTPBasicAuth(username, password)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if request.method == 'GET':
|
||||||
|
response = requests.get(backend_url, auth=auth)
|
||||||
|
elif request.method == 'POST':
|
||||||
|
response = requests.post(backend_url, auth=auth, json=request.get_json())
|
||||||
|
if response.ok:
|
||||||
|
cache.clear()
|
||||||
|
elif request.method == 'DELETE':
|
||||||
|
response = requests.delete(backend_url, auth=auth, json=request.get_json())
|
||||||
|
if response.ok:
|
||||||
|
cache.clear()
|
||||||
|
|
||||||
|
return Response(response.content, status=response.status_code, mimetype=response.headers['Content-Type'])
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
return jsonify({"error": str(e)}), 502
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app.run(
|
app.run(
|
||||||
debug=app.config["DEBUG"],
|
debug=app.config["DEBUG"],
|
||||||
|
@ -22,6 +22,9 @@ self.addEventListener('install', function(event) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
self.addEventListener('push', function(event) {
|
self.addEventListener('push', function(event) {
|
||||||
|
console.log('[Service Worker] Push Received.');
|
||||||
|
console.log(`[Service Worker] Push data: "${event.data.text()}"`);
|
||||||
|
|
||||||
const data = event.data.json();
|
const data = event.data.json();
|
||||||
const options = {
|
const options = {
|
||||||
body: data.body,
|
body: data.body,
|
||||||
|
@ -82,6 +82,28 @@
|
|||||||
}, function(err) {
|
}, function(err) {
|
||||||
console.log('ServiceWorker registration failed: ', err);
|
console.log('ServiceWorker registration failed: ', err);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const forceResubscribeBtn = document.getElementById('force-resubscribe-btn');
|
||||||
|
if (forceResubscribeBtn) {
|
||||||
|
forceResubscribeBtn.addEventListener('click', function() {
|
||||||
|
navigator.serviceWorker.ready.then(function(registration) {
|
||||||
|
registration.pushManager.getSubscription().then(function(subscription) {
|
||||||
|
if (subscription) {
|
||||||
|
subscription.unsubscribe().then(function(successful) {
|
||||||
|
if (successful) {
|
||||||
|
console.log('Unsubscribed successfully.');
|
||||||
|
askPermission(registration);
|
||||||
|
} else {
|
||||||
|
console.log('Unsubscribe failed.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
askPermission(registration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function askPermission(registration) {
|
function askPermission(registration) {
|
||||||
|
@ -3,35 +3,79 @@
|
|||||||
{% block title %}Config Dashboard{% endblock %}
|
{% block title %}Config Dashboard{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container">
|
<div class="container mt-4">
|
||||||
<h2>Configuration Dashboard</h2>
|
<h2 class="mb-4">Configuration Dashboard</h2>
|
||||||
<p>Welcome to the configuration page.</p>
|
|
||||||
<button id="send-test-notification-btn" class="btn btn-primary">Send Test Notification</button>
|
|
||||||
<button id="check-expiring-accounts-btn" class="btn btn-info">Check Expiring Accounts</button>
|
|
||||||
|
|
||||||
<div class="card mt-4">
|
<div class="row">
|
||||||
<div class="card-header">
|
<div class="col-md-12">
|
||||||
DNS Manager
|
<div class="card">
|
||||||
</div>
|
<div class="card-header">
|
||||||
<div class="card-body">
|
Actions
|
||||||
<div class="input-group mb-3">
|
</div>
|
||||||
<input type="text" class="form-control" id="dns-entry-input" placeholder="Enter DNS entry">
|
<div class="card-body">
|
||||||
<div class="input-group-append">
|
<button id="send-test-notification-btn" class="btn btn-primary">Send Test Notification</button>
|
||||||
<button class="btn btn-primary" id="add-dns-btn">Add</button>
|
<button id="check-expiring-accounts-btn" class="btn btn-info">Check Expiring Accounts</button>
|
||||||
|
<button id="force-resubscribe-btn" class="btn btn-warning">Force Re-subscribe</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mt-4">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
DNS Manager
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input type="text" class="form-control" id="dns-entry-input" placeholder="Enter DNS entry">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<button class="btn btn-primary" id="add-dns-btn">Add</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>DNS Entry</th>
|
||||||
|
<th style="width: 10%;">Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="dns-list-table-body">
|
||||||
|
<!-- DNS entries will be loaded here -->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-4">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
Extra URLs Manager
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input type="text" class="form-control" id="extra-url-input" placeholder="Enter Extra URL">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<button class="btn btn-primary" id="add-extra-url-btn">Add</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Extra URL</th>
|
||||||
|
<th style="width: 10%;">Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="extra-urls-table-body">
|
||||||
|
<!-- Extra URLs will be loaded here -->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<table class="table table-striped mt-3">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>DNS Entry</th>
|
|
||||||
<th style="width: 10%;">Actions</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="dns-list-table-body">
|
|
||||||
<!-- DNS entries will be loaded here -->
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -46,10 +90,21 @@
|
|||||||
const dnsEntryInput = document.getElementById('dns-entry-input');
|
const dnsEntryInput = document.getElementById('dns-entry-input');
|
||||||
|
|
||||||
function fetchDnsList() {
|
function fetchDnsList() {
|
||||||
fetch("{{ config.BASE_URL }}/dns")
|
fetch("{{ url_for('proxy_dns') }}")
|
||||||
.then(response => response.json())
|
.then(response => {
|
||||||
|
if (!response.ok) {
|
||||||
|
// Log the error response text for debugging
|
||||||
|
response.text().then(text => console.error('Error response from proxy:', text));
|
||||||
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
.then(data => {
|
.then(data => {
|
||||||
dnsListTableBody.innerHTML = '';
|
dnsListTableBody.innerHTML = '';
|
||||||
|
if (!Array.isArray(data)) {
|
||||||
|
console.error("Received data is not an array:", data);
|
||||||
|
throw new Error("Invalid data format received from server.");
|
||||||
|
}
|
||||||
if (data.length === 0) {
|
if (data.length === 0) {
|
||||||
const row = dnsListTableBody.insertRow();
|
const row = dnsListTableBody.insertRow();
|
||||||
const cell = row.insertCell();
|
const cell = row.insertCell();
|
||||||
@ -69,13 +124,22 @@
|
|||||||
actionCell.appendChild(removeBtn);
|
actionCell.appendChild(removeBtn);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
console.error('Error during fetchDnsList:', e);
|
||||||
|
dnsListTableBody.innerHTML = '';
|
||||||
|
const row = dnsListTableBody.insertRow();
|
||||||
|
const cell = row.insertCell();
|
||||||
|
cell.colSpan = 2;
|
||||||
|
cell.textContent = 'Error loading DNS entries. See browser console for details.';
|
||||||
|
cell.classList.add('text-center', 'text-danger');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function addDnsEntry() {
|
function addDnsEntry() {
|
||||||
const dnsEntry = dnsEntryInput.value.trim();
|
const dnsEntry = dnsEntryInput.value.trim();
|
||||||
if (dnsEntry) {
|
if (dnsEntry) {
|
||||||
fetch("{{ config.BASE_URL }}/dns", {
|
fetch("{{ url_for('proxy_dns') }}", {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
@ -89,7 +153,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function removeDnsEntry(dnsEntry) {
|
function removeDnsEntry(dnsEntry) {
|
||||||
fetch("{{ config.BASE_URL }}/dns", {
|
fetch("{{ url_for('proxy_dns') }}", {
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
@ -103,6 +167,69 @@
|
|||||||
addDnsBtn.addEventListener('click', addDnsEntry);
|
addDnsBtn.addEventListener('click', addDnsEntry);
|
||||||
fetchDnsList();
|
fetchDnsList();
|
||||||
|
|
||||||
|
// Extra URLs Manager
|
||||||
|
const extraUrlsTableBody = document.getElementById('extra-urls-table-body');
|
||||||
|
const addExtraUrlBtn = document.getElementById('add-extra-url-btn');
|
||||||
|
const extraUrlInput = document.getElementById('extra-url-input');
|
||||||
|
|
||||||
|
function fetchExtraUrlsList() {
|
||||||
|
fetch("{{ url_for('proxy_extra_urls') }}")
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
extraUrlsTableBody.innerHTML = '';
|
||||||
|
if (data.length === 0) {
|
||||||
|
const row = extraUrlsTableBody.insertRow();
|
||||||
|
const cell = row.insertCell();
|
||||||
|
cell.colSpan = 2;
|
||||||
|
cell.textContent = 'No extra URLs found.';
|
||||||
|
cell.classList.add('text-center');
|
||||||
|
} else {
|
||||||
|
data.forEach(entry => {
|
||||||
|
const row = extraUrlsTableBody.insertRow();
|
||||||
|
const entryCell = row.insertCell();
|
||||||
|
entryCell.textContent = entry;
|
||||||
|
const actionCell = row.insertCell();
|
||||||
|
const removeBtn = document.createElement('button');
|
||||||
|
removeBtn.className = 'btn btn-danger btn-sm';
|
||||||
|
removeBtn.textContent = 'Delete';
|
||||||
|
removeBtn.addEventListener('click', () => removeExtraUrl(entry));
|
||||||
|
actionCell.appendChild(removeBtn);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function addExtraUrl() {
|
||||||
|
const extraUrl = extraUrlInput.value.trim();
|
||||||
|
if (extraUrl) {
|
||||||
|
fetch("{{ url_for('proxy_extra_urls') }}", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ extra_url: extraUrl })
|
||||||
|
}).then(() => {
|
||||||
|
extraUrlInput.value = '';
|
||||||
|
fetchExtraUrlsList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeExtraUrl(extraUrl) {
|
||||||
|
fetch("{{ url_for('proxy_extra_urls') }}", {
|
||||||
|
method: 'DELETE',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ extra_url: extraUrl })
|
||||||
|
}).then(() => {
|
||||||
|
fetchExtraUrlsList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
addExtraUrlBtn.addEventListener('click', addExtraUrl);
|
||||||
|
fetchExtraUrlsList();
|
||||||
|
|
||||||
// Other buttons
|
// Other buttons
|
||||||
document.getElementById('send-test-notification-btn').addEventListener('click', function() {
|
document.getElementById('send-test-notification-btn').addEventListener('click', function() {
|
||||||
fetch('{{ url_for("send_test_notification") }}', {
|
fetch('{{ url_for("send_test_notification") }}', {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user