changeset 1035:e8f73df7ed5d draft

Add "sort by uid" button to blog table
author HIROSE Yuuji <yuuji@gentei.org>
date Wed, 06 Mar 2024 09:37:52 +0900
parents 17e21e7dcfaa
children 9c392ddb4d8a
files s4-main.js
diffstat 1 files changed, 55 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/s4-main.js	Wed Mar 06 09:32:51 2024 +0900
+++ b/s4-main.js	Wed Mar 06 09:37:52 2024 +0900
@@ -894,8 +894,11 @@
 	}
     }
     function initBlogs() {
-	// Auto-complete #xxxx
+	// (1)Auto-complete #xxxx, (2)Prepare sort
+
+	// (1)Complete #xxxx
 	let i, check = collectElementsByAttr("input", "name", "notifyto");
+	let blogheadtd = document.querySelector("table.bloghead tr td");
 	if (check)
 	    for (i of check) {
 		i.addEventListener("click", insertRedirect, false);
@@ -924,8 +927,7 @@
 	    i = document.getElementById("reload");
 	    if (i) i.addEventListener("click", ajaxPost, false);
 	    // Add CSV download button
-	    let td = document.querySelector("table.bloghead tr td");
-	    if (td) {
+	    if (blogheadtd) {
 		let btn = document.createElement("button");
 		btn.innerText = "CSVget";
 		btn.type = "button";
@@ -936,7 +938,7 @@
 Excelで利用する場合は Ctrl を押しながらクリックして下さい。
 Get seen TEXT content as CSV.`;
 		btn.addEventListener("click", getTextContentCSV, false);
-		let artlink = td.querySelector('a[accesskey="f"]');
+		let artlink = blogheadtd.querySelector('a[accesskey="f"]');
 		let spacer = document.createElement("span");
 		if (artlink) {
 		    spacer.innerText = "|";
@@ -944,8 +946,8 @@
 		    artlink.insertAdjacentElement('beforebegin', spacer);
 		} else {
 		    spacer.innerText = " ";
-		    td.appendChild(spacer);
-		    td.appendChild(btn);
+		    blogheadtd.appendChild(spacer);
+		    blogheadtd.appendChild(btn);
 		}
 	    }
 	}
@@ -960,6 +962,53 @@
 	// Hack article_m links
 	registPjaxViewers(document.querySelectorAll("a[href]"));
 	atMarkView(document);
+	/*****************************************************************/
+	//(2) Prepare sort
+	let warn = document.querySelector("tr.warn span.warn");
+	if (blogheadtd && warn==null) {
+	    let umode = "UserSORT", amode = "ArticleSort";
+	    let sbtn = document.createElement("button");
+	    sbtn.textContent = umode;
+	    sbtn.type = 'button';
+	    let spacer = document.createElement("span");
+	    spacer.textContent = " ";
+	    let hide = document.getElementById("hideauth");
+	    if (hide) {
+		hide.insertAdjacentElement('afterend', sbtn);
+		hide.insertAdjacentElement('afterend', spacer);
+	    } else {
+		blogheadtd.appendChild(spacer);
+		blogheadtd.appendChild(sbtn);
+	    }
+	    function compareRowsByUid(a, b) {
+		if (a.key1 < b.key1) return -1;
+		if (a.key1 > b.key1) return 1;
+		if (a.key2 < b.key2) return -1;
+		if (a.key2 > b.key2) return 1;
+		return 0;
+	    }
+	    function compareRowsByAid(a, b) {
+		if (a.key2 < b.key2) return -1;
+		if (a.key2 > b.key2) return 1;
+		return 0;
+	    }
+	    sbtn.addEventListener("click", (e)=>{
+		let uidsort = (sbtn.textContent.indexOf(umode) >= 0);
+		let rows = [], elm,
+		    tbl = document.querySelector("table.blog_replies");
+		for (let tr of tbl.rows) {
+		    elm = {};
+		    elm.tr = tr;
+		    elm.key1 = tr.querySelector("a.author").title; // userid
+		    tr.innerHTML.match(/<a href="(#[0-9]+)">\1</); // ArticleID
+		    elm.key2 = RegExp.$1;
+		    rows.push(elm);
+		}
+		rows.sort(uidsort ? compareRowsByUid : compareRowsByAid);
+		for (let r of rows) tbl.appendChild(r.tr);
+		sbtn.textContent = uidsort ? amode : umode;
+	    });
+	}
     }
     function initGrpAction() {
 	var rev = document.getElementById("reverse");

yatex.org