changeset 889:5843755e3b30

The beginning of AJAX operations Frozen/Running can be toggled by ajax button
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 24 Dec 2020 19:42:58 +0900
parents 7ca1f11ab5e8
children bc52f605f41d
files examples/common/default/default.css s4-blog.sh s4-funcs.sh s4-main.js scripts/s4-sns.case
diffstat 5 files changed, 155 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/examples/common/default/default.css	Tue Dec 22 10:58:03 2020 +0900
+++ b/examples/common/default/default.css	Thu Dec 24 19:42:58 2020 +0900
@@ -367,6 +367,28 @@
 span.pre {white-space: pre;}
 
 /*
+ * Frozen toggle button
+ */
+td.稼動状態 {text-align: center;}
+button.toggle-frozen {
+    padding: 0 1emex;
+    background: #fdb585;
+    border-radius: 0.2ex;
+    border-bottom: solid 2px #d27d88;
+    box-shadow: inset 0 2px 0 rgba(255,255,255,0.2), 0 2px 2px rgba(0,0,0, 0.19);
+    background: linear-gradient(#fdcccc, #ae9191); // ffc8a8
+}
+.凍結 button.toggle-frozen, .凍結 button.toggle-frozen::before {
+    background: linear-gradient(#d3d3f8, #6d6de4);
+}
+.凍結 button.toggle-frozen::before {
+    content: "凍"; color: blue;
+}
+.toggle-frozen::before {
+    content: "動";
+}
+
+/*
  * PR Web
  */
 body.pr {font-size: 200%;}
--- a/s4-blog.sh	Tue Dec 22 10:58:03 2020 +0900
+++ b/s4-blog.sh	Thu Dec 24 19:42:58 2020 +0900
@@ -1292,6 +1292,47 @@
 	 dumptable html blog 'ctime title heading' "$cond"
 )
 
+blog_setval() {
+  # $1=GRProwID $2=key $3=value
+  # RETURN VALUE(JSON):
+  #   {code: EXIT_CODE, message: MESSAGE}
+  # This function will be called via ajax control of fetch() suite,
+  # so we need to return JSON text string and exit directly.
+  rid=`numericalize $1`
+  blogowner=`getvalbyid blog owner "$rid"`
+  contenttype "application/json; charset=utf-8"; echo
+  if ! isgroup "$blogowner"; then
+    msg="グループのみの操作です";	code=1
+  elif ! isgrpowner "$user" "$blogowner"; then
+    msg="グループ管理者のみの操作です";	code=2
+  else	# With full permission
+    blogid=`query "SELECT id FROM blog WHERE rowid=$rid;"`
+    dbsetbyid blog "$blogid" "$2" "$3"
+    code=0
+  fi
+  # echo "{\"code\": $code, \"message\": \"foo\"}"; exit
+  newval=`getvalbyid blog "$2" "$1"`
+  alert="${msg:+, \"alert\": \"$msg\"}"
+  cat <<-EOF
+	{"code": $code, "$2": "`echo "$newval"|sed 's/"/\\\\"/g'`"$alert}
+	EOF
+  exit
+}
+
+blog_setfrozen() {
+  # $1=GRProwID $2=val={ "frozen" | "" }
+  case "$2" in
+    [Ff])	state="frozen" ;;
+    *)		state="" ;;
+  esac
+  err getvalbyid-blog-$1= `getvalbyid blog state "$1"`
+  case `getvalbyid blog state "$1"` in
+    [Ff][Rr]*)	newval="" ;;
+    *)		newval="frozen" ;;
+  esac
+  blog_setval "$1" state $newval
+}
+
 blog_addentry() {
   # $1=GRProwID(if it is a group)
   grprowid=`numericalize $1`
--- a/s4-funcs.sh	Tue Dec 22 10:58:03 2020 +0900
+++ b/s4-funcs.sh	Thu Dec 24 19:42:58 2020 +0900
@@ -2868,10 +2868,18 @@
 	EOF
   cond="where a.id in (select id from blog_s where key='owner' and val=$qgrp) order by 稼動状態, ctime desc"
   colstate="state:稼動状態:frozen=rowclass=凍結"
+  frzbtn='<button class="toggle-frozen"></button>'
   DT_CHLD=article:blogid \
 	 DT_QOWNER="$qgrp" \
 	 DT_VIEW=replyblog dumptable html blog \
-	 "ctime title heading team notify:通知$colmd $colstate" "$cond"
+	 "ctime title heading team notify:通知$colmd $colstate" "$cond" \
+    | if [ -n "$iamowner" ]
+  then
+    sed -Ee "s,(<TD class=\"稼動状態\">).*(</TD>),\1$frzbtn\2,"
+  else
+    cat
+  fi
+  ## DO not convert to frzbtn when not admin
   echo "</div>  <!-- in showgroupsub -->"
 
   getgname="(select gname from grp where rowid=$rowid)"
@@ -3724,6 +3732,11 @@
     showgroup $grid
   done
 }
+dt_colhack() {
+  # FROM: <TD>xxx:yyy</TD>
+  # TO:   <TD class="xxx">yyy</TD>
+  sed -Ee 's,<TD>([^:<"]+):([^<]*)(</TD>|$),<TD class="\1">\2\3,g'
+}
 dt_rowhack() {
   # From: <TR>
   #        ....
@@ -3737,7 +3750,7 @@
 	  N
 	  /<\/TR>/ {
 	    s/\n//
-	    s,^<TR>\(.*\)<TD>rowclass=\(.*\)\(</TD></TR>\),<TR class="\2">\1<TD>\2\3,
+	    s,^<TR>\(.*\)<TD\([^>]*\)>rowclass=\(.*\)\(</TD></TR>\),<TR class="\3">\1<TD\2>\3\4,
 	    n
 	  }
 	  $q
@@ -3826,6 +3839,11 @@
   substr=${substr:-%s}
   for col in ${3:-`gettbl_s_cols $2`}; do
     valvar=val
+    fromtbl=b
+    if gettblcols "$2" | grep -w "$col" >/dev/null 2>&1; then
+      # If $col belongs to master table
+      fromtbl=a; col=${col#a.}
+    fi
     case $col in
       gecos)	scols="$scols${scols:+, }${col#}"
 		continue ;;	# built-in column name
@@ -3836,15 +3854,23 @@
 			 h=${cnd%%=*} v=${cnd#*=}
 			 h=`sqlquotestr "$h"`
 			 v=`sqlquotestr "$v"`
-			 valvar="CASE val WHEN $h THEN $v END"
+			 if [ x"$fromtbl" = x"b" ]; then
+			   valvar="CASE val WHEN $h THEN $v END"
+			 else
+			   valvar="$h"
+			 fi
 			 as=${as%%:*} ;;
 		esac
 		;;
       *)	as=${col} ;;
     esac
     ss=`printf "$substr" "$valvar"`
-    eav=$eav${eav:+,}" max(case key when '$col' then $ss end) as $as"
-    scols="$scols${scols:+, }b.$as"
+    if [ x"$fromtbl" = x"b" ]; then
+      eav=$eav${eav:+,}" \"$as:\"||coalesce(max(case key when '$col' then $ss end), '') as $as"
+    else
+      eav=$eav${eav:+,}" \"$as:\"||$ss as $as"
+    fi
+    scols="$scols${scols:+, }${fromtbl}.$as"
   done
 #case author when '$user' then a.rowid else '---' end as ID,
   if [ -n "$DT_SQL" ]; then
@@ -3877,7 +3903,7 @@
     ## $ddd LINE exists at the end of this function
   fi
   printf '.mode list\n.header 0\n' >> $sqlfile
-  cat<<EOF | sed "s,\(<TR><TD>\)\([1-9][0-9]*\)\(#[0-9a-fxs]*\)*</TD>,\1$elink$dvlink</TD>," | dt_rowhack
+  cat<<EOF | sed "s,\(<TR><TD>\)\([1-9][0-9]*\)\(#[0-9a-fxs]*\)*</TD>,\1$elink$dvlink</TD>," | dt_colhack | dt_rowhack
 <div> <!-- for folding by check button (s4-funcs.sh:dumptable()) -->
 <div class="dumptable">
 <table class="b$dt_class">
--- a/s4-main.js	Tue Dec 22 10:58:03 2020 +0900
+++ b/s4-main.js	Thu Dec 24 19:42:58 2020 +0900
@@ -1,3 +1,4 @@
+// 愛
 (function (){
     function collectElementsByAttr(elm, attr, val) {
 	var e = document.getElementsByTagName(elm);
@@ -306,11 +307,69 @@
 	    }, null);
 	}
     }
+    function initGrphome() {
+	console.log("initGrphome");
+	let btn = document.querySelectorAll("button.toggle-frozen");
+	if (!btn) return;
+	let url = document.URL,
+	    mypath = url.substring(url.lastIndexOf("/"));
+	if (mypath.match(/(.*)\/(.*)/)) {
+	    mypath = RegExp.$2;
+	    mypath = mypath.substring(0, mypath.lastIndexOf("?"));
+	    //alert("mypath="+mypath);
+	} else return;
+
+	function toggleFrozen(e, rowid) {
+	    let tgt = mypath+"?blog_setfrozen+"+rowid;
+	    let tr = e.target.parentNode.parentNode;
+	    fetch(tgt, {
+		method: "POST",
+		headers: {'Content-Type': 'text/html; charset=utf-8'},
+	    }).then(function(resp) {
+		return resp.text();
+	    }).then(function(tbody) {
+		try {
+		    var json = JSON.parse(tbody);
+		} catch (e) {
+		    return;
+		}
+		let state = json.state, newstate;
+		if (json.alert) {
+		    alert(json.alert)
+		}
+		if (state.match(/frozen/i)) {
+		    newstate = "凍結";
+		} else {
+		    newstate = null;
+		}
+		tr.setAttribute("class", newstate);
+	    });
+	}
+	for (let b of btn) {
+	    let rowid = null;
+	    let td=b.parentNode, tr = td.parentNode;
+	    for (let a of tr.querySelectorAll("a[href]")) {
+		if (a.getAttribute("href").match(/\?replyblog\+([0-9]+)/)) {
+		    rowid = parseInt(RegExp.$1);
+		    break;
+		}
+	    }
+	    if (rowid && rowid>0) {
+		b.addEventListener("click", function(e) {
+		    if (!btn) return;
+		    toggleFrozen(e, rowid);
+		}, false);
+		b.setAttribute("title", "稼動/凍結をその場で切り替えます\n\
+Toggle Running/Frozen ("+rowid+")");
+	    }
+	}
+    }
     function init() {
 	initGrpAction();
 	initBlogs();
 	initFileInput();
 	initTextarea();
+	initGrphome();
     }
     document.addEventListener('DOMContentLoaded', init, null);
 })();
--- a/scripts/s4-sns.case	Tue Dec 22 10:58:03 2020 +0900
+++ b/scripts/s4-sns.case	Thu Dec 24 19:42:58 2020 +0900
@@ -46,7 +46,7 @@
     echo "Refresh: 0; $newurl"; echo
     exit 0
     ;;
-  lshandout|lshandoutall|gethandout|gethandoutcsv|gethandoutcsv2|blogseen|getteamcsv)
+  lshandout|lshandoutall|gethandout|gethandoutcsv|gethandoutcsv2|blogseen|getteamcsv|blog_setfrozen)
     case "$stage" in
       lshandout*|blogseen*) contenttype; echo ;;
     esac

yatex.org