feat: streamline network panel, conditional self-service, remove IP add endpoints
- Populate network panel from server data response instead of separate API call - Conditionally render self-service billing panel based on selfServiceMode config - Pass selfServiceMode to Smarty template vars - Remove addIPv4, addIPv6, serverIPs client endpoints and UI buttons - Remove upgrade/downgrade link from resources panel - Bump cache-busting version to v0.0.20 - Update CHANGELOG.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -77,6 +77,41 @@ function vfServerData(serviceId, systemUrl) {
|
||||
|
||||
$("#vf-resources-panel").show();
|
||||
|
||||
// Populate network panel from server data
|
||||
var ipv4List = $("#vf-ipv4-list");
|
||||
var ipv6List = $("#vf-ipv6-list");
|
||||
ipv4List.empty();
|
||||
ipv6List.empty();
|
||||
|
||||
var net = response.data.primaryNetwork || {};
|
||||
var ipv4Arr = net.ipv4Unformatted || [];
|
||||
var ipv6Arr = net.ipv6Unformatted || [];
|
||||
|
||||
if (ipv4Arr.length > 0) {
|
||||
$.each(ipv4Arr, function (i, ip) {
|
||||
var row = $('<div class="vf-ip-row"></div>');
|
||||
row.append('<span class="vf-ip-address">' + $('<span>').text(ip).html() + '</span>');
|
||||
if (i > 0) {
|
||||
row.append(' <button class="btn btn-sm btn-outline-danger vf-ip-remove" onclick="vfRemoveIP(\'' + serviceId + '\',\'' + systemUrl + '\',\'removeIPv4\',\'' + encodeURIComponent(ip) + '\')">Remove</button>');
|
||||
}
|
||||
ipv4List.append(row);
|
||||
});
|
||||
} else {
|
||||
ipv4List.append('<span class="text-muted">No IPv4 addresses</span>');
|
||||
}
|
||||
|
||||
if (ipv6Arr.length > 0) {
|
||||
$.each(ipv6Arr, function (i, subnet) {
|
||||
var row = $('<div class="vf-ip-row"></div>');
|
||||
row.append('<span class="vf-ip-address">' + $('<span>').text(subnet).html() + '</span>');
|
||||
ipv6List.append(row);
|
||||
});
|
||||
} else {
|
||||
ipv6List.append('<span class="text-muted">No IPv6 subnets</span>');
|
||||
}
|
||||
|
||||
$("#vf-network-content").show();
|
||||
|
||||
$("#vf-server-info").show();
|
||||
} else {
|
||||
$("#vf-server-info-error").show();
|
||||
@@ -301,92 +336,6 @@ function impersonateServerOwner(serviceId, systemUrl) {
|
||||
// Network / IP Management
|
||||
// =========================================================================
|
||||
|
||||
function vfLoadServerIPs(serviceId, systemUrl) {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
url: systemUrl + "modules/servers/VirtFusionDirect/client.php?serviceID=" + encodeURIComponent(serviceId) + "&action=serverIPs"
|
||||
}).done(function (response) {
|
||||
if (response.success) {
|
||||
var ipv4List = $("#vf-ipv4-list");
|
||||
var ipv6List = $("#vf-ipv6-list");
|
||||
ipv4List.empty();
|
||||
ipv6List.empty();
|
||||
|
||||
if (response.data.ipv4 && response.data.ipv4.length > 0) {
|
||||
$.each(response.data.ipv4, function (i, ip) {
|
||||
var row = $('<div class="vf-ip-row"></div>');
|
||||
row.append('<span class="vf-ip-address">' + $('<span>').text(ip).html() + '</span>');
|
||||
if (i > 0) {
|
||||
row.append(' <button class="btn btn-sm btn-outline-danger vf-ip-remove" onclick="vfRemoveIP(\'' + serviceId + '\',\'' + systemUrl + '\',\'removeIPv4\',\'' + encodeURIComponent(ip) + '\')">Remove</button>');
|
||||
}
|
||||
ipv4List.append(row);
|
||||
});
|
||||
} else {
|
||||
ipv4List.append('<span class="text-muted">No IPv4 addresses</span>');
|
||||
}
|
||||
|
||||
if (response.data.ipv6 && response.data.ipv6.length > 0) {
|
||||
$.each(response.data.ipv6, function (i, subnet) {
|
||||
var row = $('<div class="vf-ip-row"></div>');
|
||||
row.append('<span class="vf-ip-address">' + $('<span>').text(subnet).html() + '</span>');
|
||||
row.append(' <button class="btn btn-sm btn-outline-danger vf-ip-remove" onclick="vfRemoveIP(\'' + serviceId + '\',\'' + systemUrl + '\',\'removeIPv6\',\'' + encodeURIComponent(subnet) + '\')">Remove</button>');
|
||||
ipv6List.append(row);
|
||||
});
|
||||
} else {
|
||||
ipv6List.append('<span class="text-muted">No IPv6 subnets</span>');
|
||||
}
|
||||
|
||||
$("#vf-network-content").show();
|
||||
} else {
|
||||
$("#vf-network-content").show();
|
||||
$("#vf-ipv4-list").html('<span class="text-muted">Unable to load</span>');
|
||||
$("#vf-ipv6-list").html('<span class="text-muted">Unable to load</span>');
|
||||
}
|
||||
}).fail(function () {
|
||||
$("#vf-network-content").show();
|
||||
$("#vf-ipv4-list").html('<span class="text-muted">Unable to load</span>');
|
||||
$("#vf-ipv6-list").html('<span class="text-muted">Unable to load</span>');
|
||||
}).always(function () {
|
||||
$("#vf-network-loader").hide();
|
||||
});
|
||||
}
|
||||
|
||||
function vfAddIP(serviceId, systemUrl, action) {
|
||||
var btn = $("#vf-add-" + (action === "addIPv4" ? "ipv4" : "ipv6"));
|
||||
var spinner = btn.find(".vf-btn-spinner");
|
||||
var alertDiv = $("#vf-network-alert");
|
||||
|
||||
btn.prop("disabled", true);
|
||||
spinner.show();
|
||||
alertDiv.hide();
|
||||
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
dataType: "json",
|
||||
url: systemUrl + "modules/servers/VirtFusionDirect/client.php?serviceID=" + encodeURIComponent(serviceId) + "&action=" + encodeURIComponent(action)
|
||||
}).done(function (response) {
|
||||
if (response.success) {
|
||||
alertDiv.removeClass("alert-danger").addClass("alert-success");
|
||||
alertDiv.text(response.data.message || "IP address added successfully.");
|
||||
alertDiv.show();
|
||||
// Refresh IP list
|
||||
vfLoadServerIPs(serviceId, systemUrl);
|
||||
} else {
|
||||
alertDiv.removeClass("alert-success").addClass("alert-danger");
|
||||
alertDiv.text(response.errors || "Failed to add IP address.");
|
||||
alertDiv.show();
|
||||
}
|
||||
}).fail(function () {
|
||||
alertDiv.removeClass("alert-success").addClass("alert-danger");
|
||||
alertDiv.text("An error occurred. Please try again.");
|
||||
alertDiv.show();
|
||||
}).always(function () {
|
||||
spinner.hide();
|
||||
btn.prop("disabled", false);
|
||||
});
|
||||
}
|
||||
|
||||
function vfRemoveIP(serviceId, systemUrl, action, identifier) {
|
||||
if (!confirm("Are you sure you want to remove this IP address?")) {
|
||||
return;
|
||||
@@ -406,7 +355,7 @@ function vfRemoveIP(serviceId, systemUrl, action, identifier) {
|
||||
alertDiv.removeClass("alert-danger").addClass("alert-success");
|
||||
alertDiv.text(response.data.message || "IP address removed successfully.");
|
||||
alertDiv.show();
|
||||
vfLoadServerIPs(serviceId, systemUrl);
|
||||
vfServerData(serviceId, systemUrl);
|
||||
} else {
|
||||
alertDiv.removeClass("alert-success").addClass("alert-danger");
|
||||
alertDiv.text(response.errors || "Failed to remove IP address.");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<link href="{$systemURL}modules/servers/VirtFusionDirect/templates/css/module.css?v=0.0.19" rel="stylesheet">
|
||||
<script src="{$systemURL}modules/servers/VirtFusionDirect/templates/js/module.js?v=0.0.19"></script>
|
||||
<link href="{$systemURL}modules/servers/VirtFusionDirect/templates/css/module.css?v=0.0.20" rel="stylesheet">
|
||||
<script src="{$systemURL}modules/servers/VirtFusionDirect/templates/js/module.js?v=0.0.20"></script>
|
||||
|
||||
{if $serviceStatus eq 'Active'}
|
||||
|
||||
@@ -175,30 +175,18 @@
|
||||
</div>
|
||||
<div class="panel-body card-body p-4">
|
||||
<div id="vf-network-alert" class="alert" style="display: none;"></div>
|
||||
<div id="vf-network-loader" class="d-flex align-items-center justify-content-center" style="min-height: 60px;">
|
||||
<div class="spinner-border spinner-border-sm"></div>
|
||||
</div>
|
||||
<div id="vf-network-content" style="display: none;">
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6">
|
||||
<h5 class="vf-bold">IPv4 Addresses</h5>
|
||||
<div id="vf-ipv4-list" class="mb-2"></div>
|
||||
<button id="vf-add-ipv4" onclick="vfAddIP('{$serviceid}','{$systemURL}','addIPv4')" type="button" class="btn btn-sm btn-outline-primary">
|
||||
<span class="vf-btn-spinner spinner-border spinner-border-sm" style="display:none;"></span>
|
||||
Add IPv4
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h5 class="vf-bold">IPv6 Subnets</h5>
|
||||
<div id="vf-ipv6-list" class="mb-2"></div>
|
||||
<button id="vf-add-ipv6" onclick="vfAddIP('{$serviceid}','{$systemURL}','addIPv6')" type="button" class="btn btn-sm btn-outline-primary">
|
||||
<span class="vf-btn-spinner spinner-border spinner-border-sm" style="display:none;"></span>
|
||||
Add IPv6
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>vfLoadServerIPs('{$serviceid}', '{$systemURL}');</script>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -247,7 +235,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<a href="clientarea.php?action=upgrade&id={$serviceid}" class="btn btn-outline-primary mt-2">Upgrade / Downgrade Resources</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -267,6 +254,7 @@
|
||||
</div>
|
||||
|
||||
{* Self Service — Billing & Usage Panel *}
|
||||
{if $selfServiceMode > 0}
|
||||
<div id="vf-selfservice-panel" class="panel card panel-default mb-3" style="display: none;">
|
||||
<div class="panel-heading card-header">
|
||||
<h3 class="panel-title card-title m-0">Billing & Usage</h3>
|
||||
@@ -313,6 +301,7 @@
|
||||
<script>vfLoadSelfServiceUsage('{$serviceid}', '{$systemURL}');</script>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{elseif $serviceStatus eq 'Suspended'}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user