diff --git a/modules/data/webadmin/files/webadmin.js b/modules/data/webadmin/files/webadmin.js
index ba2ff687..f9774d5d 100644
--- a/modules/data/webadmin/files/webadmin.js
+++ b/modules/data/webadmin/files/webadmin.js
@@ -165,6 +165,31 @@ function serverlist_init($) {
})();
}
+function channellist_init($) {
+ function update_rows() {
+ $("#channels > tr").each(function(i) {
+ $(this).toggleClass("evenrow", i % 2 === 1).toggleClass("oddrow", i % 2 === 0);
+ $(this).find(".channel_index").val(i + 1);
+ });
+ }
+ $("#channels").sortable({
+ axis: "y",
+ update: update_rows
+ });
+ $(".channel_index").change(function() {
+ var src = $(this).closest("tr").detach();
+ var rows = $("#channels > tr");
+ var dst = rows[this.value - 1];
+
+ if (dst)
+ src.insertBefore(dst);
+ else
+ src.insertAfter(rows.last());
+
+ update_rows();
+ });
+}
+
function ctcpreplies_init($) {
function serialize() {
var text = "";
diff --git a/modules/data/webadmin/tmpl/add_edit_network.tmpl b/modules/data/webadmin/tmpl/add_edit_network.tmpl
index c0e4462d..9a1a9870 100644
--- a/modules/data/webadmin/tmpl/add_edit_network.tmpl
+++ b/modules/data/webadmin/tmpl/add_edit_network.tmpl
@@ -184,6 +184,7 @@
| [ FORMAT "Add" ?>] |
IF ChannelLoop ?>
+ FORMAT "Index" ?> |
FORMAT "Save" ?> |
FORMAT "Name" ?> |
FORMAT "CurModes" ?> |
@@ -196,13 +197,14 @@
-
+
LOOP ChannelLoop ?>
|
[ FORMAT "Edit" ?>] [ FORMAT "Del" ?>]
|
+ |
checked="checked" ENDIF ?> /> |
VAR Name ?> |
VAR CurModes ?> |
@@ -213,6 +215,7 @@
ENDLOOP ?>
+
ENDIF ?>
diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp
index 7fada328..7671eb8b 100644
--- a/modules/webadmin.cpp
+++ b/modules/webadmin.cpp
@@ -1001,6 +1001,7 @@ class CWebAdminMod : public CModule {
}
const vector& Channels = pNetwork->GetChans();
+ unsigned int uIndex = 1;
for (const CChan* pChan : Channels) {
CTemplate& l = Tmpl.AddRow("ChannelLoop");
@@ -1021,6 +1022,9 @@ class CWebAdminMod : public CModule {
if (pChan->InConfig()) {
l["InConfig"] = "true";
}
+
+ l["MaxIndex"] = CString(Channels.size());
+ l["Index"] = CString(uIndex++);
}
for (const CString& sFP : pNetwork->GetTrustedFingerprints()) {
CTemplate& l = Tmpl.AddRow("TrustedFingerprints");
@@ -1157,6 +1161,13 @@ class CWebAdminMod : public CModule {
for (const CString& sChan : vsArgs) {
CChan* pChan = pNetwork->FindChan(sChan.TrimRight_n("\r"));
if (pChan) {
+ CString sError;
+ if (!pNetwork->MoveChan(
+ sChan, WebSock.GetParam("index_" + sChan).ToUInt() - 1,
+ sError)) {
+ WebSock.PrintErrorPage(sError);
+ return true;
+ }
pChan->SetInConfig(WebSock.GetParam("save_" + sChan).ToBool());
}
}
diff --git a/webskins/_default_/pub/_default_.css b/webskins/_default_/pub/_default_.css
index e1cae329..78528a72 100644
--- a/webskins/_default_/pub/_default_.css
+++ b/webskins/_default_/pub/_default_.css
@@ -393,3 +393,8 @@ td {
.textsection p {
margin-bottom: 0.7em;
}
+
+input.channel_index {
+ width: 3em;
+ min-width: unset;
+}