mirror of
https://github.com/caiwx86/small-packages.git
synced 2026-09-14 04:14:40 +08:00
244 lines
8.0 KiB
HTML
244 lines
8.0 KiB
HTML
<%
|
|
local api = self.api
|
|
local appname = api.appname
|
|
-%>
|
|
<style>
|
|
#cbi-<%=appname%>-socks .td.cbi-value-field > div {
|
|
white-space: nowrap;
|
|
}
|
|
@media (max-width: 1152px) {
|
|
#cbi-<%=appname%>-socks .td.cbi-value-field > div {
|
|
white-space: normal;
|
|
}
|
|
}
|
|
|
|
.shunt-tab-hidden {
|
|
display: none !important;
|
|
visibility: hidden !important;
|
|
}
|
|
|
|
@media screen and (max-width: 1152px) {
|
|
#cbi-<%=appname%>-socks .cbi-section-table-titles {
|
|
display: none !important;
|
|
}
|
|
}
|
|
|
|
@media screen and (min-width: 1152px) {
|
|
#cbi-<%=appname%>-socks input[id*=".<%=appname%>."][id$=".port"],
|
|
#cbi-<%=appname%>-socks input[id*=".<%=appname%>."][id$=".http_port"] {
|
|
width: 100px !important;
|
|
min-width: unset !important;
|
|
max-width: unset !important;
|
|
text-align: center !important;
|
|
}
|
|
}
|
|
</style>
|
|
<script type="text/javascript">
|
|
//<![CDATA[
|
|
const shunt_list = JSON.parse('<%=self.shunt_list%>');
|
|
|
|
function to_edit_node(btn) {
|
|
if (!btn) return;
|
|
const idReg = /^cbid\..*\..*node$/;
|
|
let hidden_select = null;
|
|
const container = btn.closest('#cbi-<%=appname%>-global') || btn.closest('#cbi-<%=appname%>-socks');
|
|
if (!container) return null;
|
|
const selects = container.querySelectorAll('select[id^="cbid."][id*="."][id$="node"]');
|
|
for (const sel of selects) {
|
|
if ( idReg.test(sel.id) && getComputedStyle(sel).display === "none" && (sel.compareDocumentPosition(btn) & Node.DOCUMENT_POSITION_FOLLOWING)) {
|
|
hidden_select = sel;
|
|
}
|
|
}
|
|
if (!hidden_select) return;
|
|
let node_select_value = hidden_select?.options[0]?.value;
|
|
if (!node_select_value || node_select_value.indexOf("_default") === 0 || node_select_value.indexOf("_direct") === 0 || node_select_value.indexOf("_blackhole") === 0) {
|
|
return;
|
|
}
|
|
let to_url = '<%=api.url("node_config")%>/' + node_select_value;
|
|
if (node_select_value.indexOf("Socks_") === 0) {
|
|
to_url = '<%=api.url("socks_config")%>/' + node_select_value.substring("Socks_".length);
|
|
}
|
|
location.href = to_url;
|
|
}
|
|
|
|
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
|
|
async function go() {
|
|
const _status = document.getElementsByClassName('_status');
|
|
for (let i = 0; i < _status.length; i++) {
|
|
const id = _status[i].getAttribute("socks_id");
|
|
XHR.get('<%=api.url("socks_status")%>', {
|
|
index: i,
|
|
id: id
|
|
},
|
|
function(x, result) {
|
|
const index = result.index;
|
|
let div = '';
|
|
const div1 = '<font style="font-weight:bold;" color="green">✓</font> ';
|
|
const div2 = '<font style="font-weight:bold;" color="red">X</font> ';
|
|
|
|
if (result.socks_status) {
|
|
div += div1;
|
|
} else {
|
|
div += div2;
|
|
}
|
|
if (result.use_http) {
|
|
if (result.http_status) {
|
|
div += div1;
|
|
} else {
|
|
div += div2;
|
|
}
|
|
}
|
|
_status[index].innerHTML = div;
|
|
}
|
|
);
|
|
}
|
|
|
|
let global_id = null;
|
|
const global = document.getElementById("cbi-<%=appname%>-global");
|
|
if (global) {
|
|
// Add an "Edit" placeholder to the routing rule node in advance to ensure left alignment of the node list.
|
|
document.querySelectorAll('.td[data-widget="nodes_listvalue"][data-name="_node"] > div').forEach(container => {
|
|
if (!container.querySelector('.shunt-node-placeholder')) {
|
|
const placeholder = document.createElement('div');
|
|
placeholder.className = 'shunt-node-placeholder';
|
|
placeholder.style.cssText = 'display:inline-flex; width:40px; flex-shrink:0;';
|
|
container.appendChild(placeholder);
|
|
}
|
|
});
|
|
|
|
await delay(100);
|
|
|
|
const node = global.getElementsByClassName("cbi-section-node")[0];
|
|
const node_id = node.getAttribute("id");
|
|
global_id = node_id;
|
|
const all_node = node.querySelectorAll("[id]");
|
|
const reg1 = /^cbid\..*node\.main$/;
|
|
//const reg1 = /^cbid\..*\.(node)\.main$/;
|
|
|
|
for (let i = 0; i < all_node.length; i++) {
|
|
const el = all_node[i];
|
|
if (!reg1.test(el.id)) continue;
|
|
|
|
const node_select = el;
|
|
if (!node_select) continue;
|
|
const cbid = el.id.replace(/\.main$/, "");
|
|
const hidden_select = document.getElementById(cbid);
|
|
const node_select_value = hidden_select?.options[0]?.value;
|
|
if (!node_select_value || node_select_value.indexOf("_default") === 0 || node_select_value.indexOf("_direct") === 0 || node_select_value.indexOf("_blackhole") === 0) {
|
|
continue;
|
|
}
|
|
|
|
let html = '<a href="#" onclick="return to_edit_node(this);"><%:Edit%></a>';
|
|
|
|
const m = cbid.match(/\.node$/);
|
|
if (m) {
|
|
html += '<a href="#" onclick="window.open(\'' + '<%=api.url("get_redir_log")%>?id=default&name=' + 'global' + '\', \'_blank\')"><%:Log%></a>';
|
|
}
|
|
|
|
html = '<div class="node-actions" style="display:inline-flex; align-items:center; gap:4px; flex-wrap:wrap; margin-left:4px;">' + html + '</div>'
|
|
|
|
const placeholder = node_select.parentElement.querySelector('.shunt-node-placeholder');
|
|
if (placeholder) {
|
|
placeholder.innerHTML = html;
|
|
} else {
|
|
node_select.insertAdjacentHTML("beforeend", html);
|
|
}
|
|
}
|
|
}
|
|
|
|
const socks = document.getElementById("cbi-<%=appname%>-socks");
|
|
if (socks) {
|
|
const socks_enabled_dom = document.getElementById(global_id + "-socks_enabled");
|
|
const descr = socks.getElementsByClassName("cbi-section-descr")[0];
|
|
descr.replaceWith(socks_enabled_dom);
|
|
const rows = socks.getElementsByClassName("cbi-section-table-row");
|
|
for (let i = 0; i < rows.length; i++) {
|
|
try {
|
|
const row = rows[i];
|
|
const id = row.id;
|
|
if (!id) continue;
|
|
let dom_id = id + "-node";
|
|
const cbid = dom_id.replace("cbi-", "cbid-").replace(new RegExp("-", 'g'), ".");
|
|
dom_id = cbid + ".main";
|
|
const node_select = document.getElementById(dom_id);
|
|
if (!node_select) continue;
|
|
|
|
let html = '<a href="#" onclick="return to_edit_node(this);"><%:Edit%></a>';
|
|
html += '<a href="#" onclick="window.open(\'' + '<%=api.url("get_socks_log")%>?name=' + id.replace("cbi-<%=appname%>-", "") + '\', \'_blank\')"><%:Log%></a>';
|
|
|
|
node_select.insertAdjacentHTML("afterend",
|
|
'<div class="node-actions" style="display:inline-flex; align-items:center; gap:4px; flex-wrap:wrap; margin-left:4px;">'
|
|
+ html + '</div>'
|
|
);
|
|
} catch(err) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
(function () {
|
|
let lastCount = 0;
|
|
let stableTimes = 0;
|
|
const STABLE_THRESHOLD = 5;
|
|
function waitStable() {
|
|
const list = document.querySelectorAll('[id^="cbid.<%=appname%>."][id$="node.main"]');
|
|
const count = list.length;
|
|
if (count === lastCount && count > 0) {
|
|
stableTimes++;
|
|
} else {
|
|
stableTimes = 0;
|
|
lastCount = count;
|
|
}
|
|
if (stableTimes >= STABLE_THRESHOLD) {
|
|
go();
|
|
return;
|
|
}
|
|
requestAnimationFrame(waitStable);
|
|
}
|
|
waitStable();
|
|
})();
|
|
|
|
document.addEventListener("DOMContentLoaded", () => setTimeout(() => {
|
|
const hiddenSelect = document.getElementById("cbid.<%=appname%>.<%=self.global_cfgid%>.node");
|
|
let o_val = hiddenSelect.value
|
|
const o_hasItem = shunt_list.find(element => element.id == o_val);
|
|
hiddenSelect.addEventListener("change", function(el){
|
|
let new_val = el.target.value
|
|
const new_hasItem = shunt_list.find(element => element.id == new_val);
|
|
if (new_hasItem) {
|
|
XHR.get('<%=api.url("update_config")%>', {
|
|
id: "<%=self.global_cfgid%>",
|
|
data: JSON.stringify({
|
|
node: new_val
|
|
})
|
|
},
|
|
function(x, data) {
|
|
if (x && x.status == 200 && data.code == 1) {
|
|
window.location.reload();
|
|
}
|
|
else {
|
|
alert("<%:Error%>");
|
|
}
|
|
});
|
|
} else {
|
|
try {
|
|
document.getElementById("tab.<%=appname%>.<%=self.global_cfgid%>.Shunt").classList.add('shunt-tab-hidden');
|
|
document.getElementById("tab.<%=appname%>.<%=self.global_cfgid%>.Shunt").style.display = "none";
|
|
} catch (error) {}
|
|
try {
|
|
document.querySelector('li[data-tab*="Shunt"]').classList.add('shunt-tab-hidden');
|
|
document.querySelector('li[data-tab*="Shunt"]').style.display = "none";
|
|
} catch (error) {}
|
|
}
|
|
});
|
|
let shunt_taboption = document.getElementById("container.<%=appname%>.<%=self.global_cfgid%>.Shunt");
|
|
if (shunt_taboption) {
|
|
let shunt_option_list = document.getElementById("cbi-<%=appname%>-shunt_option_list");
|
|
if (shunt_option_list) {
|
|
shunt_taboption.appendChild(shunt_option_list);
|
|
}
|
|
}
|
|
}, 100));
|
|
//]]>
|
|
</script> |