diff --git a/www/caddy/pkg-descr b/www/caddy/pkg-descr
index fc2608ebf..7ef7b776b 100644
--- a/www/caddy/pkg-descr
+++ b/www/caddy/pkg-descr
@@ -30,6 +30,8 @@ Plugin Changelog
Add: Run Caddy as "www" user and group, by enabling "Disable Superuser" in General Settings.
Cleanup: Validations in general.volt are all appended to their form keys, instead of triggering a Bootstrap Dialog.
Change: Description Fields are optional now, reducing the steps needed to create new entries.
+Add: Shortcuts to add new Domains and Handlers.
+Change: Subdomain Tab only appears when a wildcard domain has been configured.
1.6.0
diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogHandle.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogHandle.xml
index f467f6576..85ac5b0c4 100644
--- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogHandle.xml
+++ b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogHandle.xml
@@ -17,12 +17,22 @@
dropdown
+
+ handle.description
+
+ text
+
+
+
+ header
+
+ true
+
handle.HandleType
dropdown
- true
handle.HandlePath
@@ -30,12 +40,6 @@
text
-
- handle.description
-
- text
-
-
header
@@ -71,7 +75,7 @@
true
192.168.1.1
-
+
handle.ToPort
@@ -87,6 +91,17 @@
true
+
+ handle.HttpTlsInsecureSkipVerify
+
+ checkbox
+
+
+
+ header
+
+ true
+
handle.PassiveHealthFailDuration
@@ -128,12 +143,6 @@
checkbox
-
- handle.HttpTlsInsecureSkipVerify
-
- checkbox
-
-
handle.HttpTlsTrustedCaCerts
diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogReverseProxy.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogReverseProxy.xml
index 643db447d..eb8e1b366 100644
--- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogReverseProxy.xml
+++ b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/dialogReverseProxy.xml
@@ -10,14 +10,14 @@
text
example.com
-
+
reverse.FromPort
text
443
-
+
reverse.description
diff --git a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/general.xml b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/general.xml
index 4e9a159a7..54cdbba93 100644
--- a/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/general.xml
+++ b/www/caddy/src/opnsense/mvc/app/controllers/OPNsense/Caddy/forms/general.xml
@@ -46,6 +46,7 @@
dropdown
+ true
caddy.general.abort
@@ -59,5 +60,6 @@
text
10
+ true
diff --git a/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/reverse_proxy.volt b/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/reverse_proxy.volt
index fb9bc191f..9e2cea7c9 100644
--- a/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/reverse_proxy.volt
+++ b/www/caddy/src/opnsense/mvc/app/views/OPNsense/Caddy/reverse_proxy.volt
@@ -155,6 +155,7 @@
// Update only the service control UI for 'caddy'
showAlert("{{ lang._('Configuration applied successfully.') }}", "{{ lang._('Apply Success') }}");
updateServiceControlUI('caddy');
+ checkAndToggleSubdomainsTab();
} else {
console.error("{{ lang._('Action was not successful or an error occurred:') }}", data);
}
@@ -196,7 +197,7 @@
// Control the visibility of selectpicker for filter by domain
function toggleSelectPicker(tab) {
- if (tab === 'handlesTab' || tab === 'domainsTab') {
+ if (tab === 'handlesTab' || tab === 'domainsTab' || tab === 'subdomainsTab') {
$('.common-filter').show();
} else {
$('.common-filter').hide();
@@ -213,6 +214,61 @@
toggleSelectPicker(currentTab);
});
+ // Add click event listener for "Add Upstream" button
+ $("#addHandleBtn").on("click", function() {
+ if ($('#maintabs .active a').attr('href') === "#handlesTab") {
+ // Directly open the dialog if already in the Handles tab
+ $("#addReverseHandleBtn").click();
+ } else {
+ // Switch to the "Handlers" tab if not already there
+ $('#maintabs a[href="#handlesTab"]').tab('show').one('shown.bs.tab', function(e) {
+ $("#addReverseHandleBtn").click();
+ });
+ }
+ });
+
+ // Add click event listener for "Add Domain" button
+ $("#addDomainBtn").on("click", function() {
+ if ($('#maintabs .active a').attr('href') === "#domainsTab") {
+ $("#addReverseProxyBtn").click();
+ } else {
+ $('#maintabs a[href="#domainsTab"]').tab('show').one('shown.bs.tab', function(e) {
+ $("#addReverseProxyBtn").click();
+ });
+ }
+ });
+
+ // Check and set the visibility of the Subdomains tab on initial load
+ checkAndToggleSubdomainsTab();
+
+ // Function to check and toggle Subdomains tab
+ function checkAndToggleSubdomainsTab() {
+ $.ajax({
+ url: '/api/caddy/ReverseProxy/getAllReverseDomains',
+ type: 'GET',
+ dataType: 'json',
+ success: function(response) {
+ let hasWildcard = response.rows.some(domain => domain.domainPort.startsWith('*'));
+ toggleSubdomainsTab(hasWildcard);
+ },
+ error: function() {
+ console.error("{{ lang._('Failed to load domain data from getAllReverseDomains') }}");
+ }
+ });
+ }
+
+ // Function to show or hide the Subdomains tab
+ function toggleSubdomainsTab(visible) {
+ let subdomainsTab = $('#maintabs a[href="#subdomainsTab"]').parent();
+ if (visible) {
+ subdomainsTab.show();
+ } else {
+ subdomainsTab.hide();
+ if (subdomainsTab.hasClass('active')) {
+ $('#maintabs a[href="#domainsTab"]').tab('show');
+ }
+ }
+ }
});
@@ -223,20 +279,30 @@
margin-right: 5px;
padding: 0 15px; // Align with the tables
}
-
+ .custom-header {
+ font-weight: 800;
+ font-size: 16px;
+ font-style: italic;
+ }