s4

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 diff
     1.1 --- a/examples/common/default/default.css	Tue Dec 22 10:58:03 2020 +0900
     1.2 +++ b/examples/common/default/default.css	Thu Dec 24 19:42:58 2020 +0900
     1.3 @@ -367,6 +367,28 @@
     1.4  span.pre {white-space: pre;}
     1.5  
     1.6  /*
     1.7 + * Frozen toggle button
     1.8 + */
     1.9 +td.稼動状態 {text-align: center;}
    1.10 +button.toggle-frozen {
    1.11 +    padding: 0 1emex;
    1.12 +    background: #fdb585;
    1.13 +    border-radius: 0.2ex;
    1.14 +    border-bottom: solid 2px #d27d88;
    1.15 +    box-shadow: inset 0 2px 0 rgba(255,255,255,0.2), 0 2px 2px rgba(0,0,0, 0.19);
    1.16 +    background: linear-gradient(#fdcccc, #ae9191); // ffc8a8
    1.17 +}
    1.18 +.凍結 button.toggle-frozen, .凍結 button.toggle-frozen::before {
    1.19 +    background: linear-gradient(#d3d3f8, #6d6de4);
    1.20 +}
    1.21 +.凍結 button.toggle-frozen::before {
    1.22 +    content: "凍"; color: blue;
    1.23 +}
    1.24 +.toggle-frozen::before {
    1.25 +    content: "動";
    1.26 +}
    1.27 +
    1.28 +/*
    1.29   * PR Web
    1.30   */
    1.31  body.pr {font-size: 200%;}
     2.1 --- a/s4-blog.sh	Tue Dec 22 10:58:03 2020 +0900
     2.2 +++ b/s4-blog.sh	Thu Dec 24 19:42:58 2020 +0900
     2.3 @@ -1292,6 +1292,47 @@
     2.4  	 dumptable html blog 'ctime title heading' "$cond"
     2.5  )
     2.6  
     2.7 +blog_setval() {
     2.8 +  # $1=GRProwID $2=key $3=value
     2.9 +  # RETURN VALUE(JSON):
    2.10 +  #   {code: EXIT_CODE, message: MESSAGE}
    2.11 +  # This function will be called via ajax control of fetch() suite,
    2.12 +  # so we need to return JSON text string and exit directly.
    2.13 +  rid=`numericalize $1`
    2.14 +  blogowner=`getvalbyid blog owner "$rid"`
    2.15 +  contenttype "application/json; charset=utf-8"; echo
    2.16 +  if ! isgroup "$blogowner"; then
    2.17 +    msg="グループのみの操作です";	code=1
    2.18 +  elif ! isgrpowner "$user" "$blogowner"; then
    2.19 +    msg="グループ管理者のみの操作です";	code=2
    2.20 +  else	# With full permission
    2.21 +    blogid=`query "SELECT id FROM blog WHERE rowid=$rid;"`
    2.22 +    dbsetbyid blog "$blogid" "$2" "$3"
    2.23 +    code=0
    2.24 +  fi
    2.25 +  # echo "{\"code\": $code, \"message\": \"foo\"}"; exit
    2.26 +  newval=`getvalbyid blog "$2" "$1"`
    2.27 +  alert="${msg:+, \"alert\": \"$msg\"}"
    2.28 +  cat <<-EOF
    2.29 +	{"code": $code, "$2": "`echo "$newval"|sed 's/"/\\\\"/g'`"$alert}
    2.30 +	EOF
    2.31 +  exit
    2.32 +}
    2.33 +
    2.34 +blog_setfrozen() {
    2.35 +  # $1=GRProwID $2=val={ "frozen" | "" }
    2.36 +  case "$2" in
    2.37 +    [Ff])	state="frozen" ;;
    2.38 +    *)		state="" ;;
    2.39 +  esac
    2.40 +  err getvalbyid-blog-$1= `getvalbyid blog state "$1"`
    2.41 +  case `getvalbyid blog state "$1"` in
    2.42 +    [Ff][Rr]*)	newval="" ;;
    2.43 +    *)		newval="frozen" ;;
    2.44 +  esac
    2.45 +  blog_setval "$1" state $newval
    2.46 +}
    2.47 +
    2.48  blog_addentry() {
    2.49    # $1=GRProwID(if it is a group)
    2.50    grprowid=`numericalize $1`
     3.1 --- a/s4-funcs.sh	Tue Dec 22 10:58:03 2020 +0900
     3.2 +++ b/s4-funcs.sh	Thu Dec 24 19:42:58 2020 +0900
     3.3 @@ -2868,10 +2868,18 @@
     3.4  	EOF
     3.5    cond="where a.id in (select id from blog_s where key='owner' and val=$qgrp) order by 稼動状態, ctime desc"
     3.6    colstate="state:稼動状態:frozen=rowclass=凍結"
     3.7 +  frzbtn='<button class="toggle-frozen"></button>'
     3.8    DT_CHLD=article:blogid \
     3.9  	 DT_QOWNER="$qgrp" \
    3.10  	 DT_VIEW=replyblog dumptable html blog \
    3.11 -	 "ctime title heading team notify:通知$colmd $colstate" "$cond"
    3.12 +	 "ctime title heading team notify:通知$colmd $colstate" "$cond" \
    3.13 +    | if [ -n "$iamowner" ]
    3.14 +  then
    3.15 +    sed -Ee "s,(<TD class=\"稼動状態\">).*(</TD>),\1$frzbtn\2,"
    3.16 +  else
    3.17 +    cat
    3.18 +  fi
    3.19 +  ## DO not convert to frzbtn when not admin
    3.20    echo "</div>  <!-- in showgroupsub -->"
    3.21  
    3.22    getgname="(select gname from grp where rowid=$rowid)"
    3.23 @@ -3724,6 +3732,11 @@
    3.24      showgroup $grid
    3.25    done
    3.26  }
    3.27 +dt_colhack() {
    3.28 +  # FROM: <TD>xxx:yyy</TD>
    3.29 +  # TO:   <TD class="xxx">yyy</TD>
    3.30 +  sed -Ee 's,<TD>([^:<"]+):([^<]*)(</TD>|$),<TD class="\1">\2\3,g'
    3.31 +}
    3.32  dt_rowhack() {
    3.33    # From: <TR>
    3.34    #        ....
    3.35 @@ -3737,7 +3750,7 @@
    3.36  	  N
    3.37  	  /<\/TR>/ {
    3.38  	    s/\n//
    3.39 -	    s,^<TR>\(.*\)<TD>rowclass=\(.*\)\(</TD></TR>\),<TR class="\2">\1<TD>\2\3,
    3.40 +	    s,^<TR>\(.*\)<TD\([^>]*\)>rowclass=\(.*\)\(</TD></TR>\),<TR class="\3">\1<TD\2>\3\4,
    3.41  	    n
    3.42  	  }
    3.43  	  $q
    3.44 @@ -3826,6 +3839,11 @@
    3.45    substr=${substr:-%s}
    3.46    for col in ${3:-`gettbl_s_cols $2`}; do
    3.47      valvar=val
    3.48 +    fromtbl=b
    3.49 +    if gettblcols "$2" | grep -w "$col" >/dev/null 2>&1; then
    3.50 +      # If $col belongs to master table
    3.51 +      fromtbl=a; col=${col#a.}
    3.52 +    fi
    3.53      case $col in
    3.54        gecos)	scols="$scols${scols:+, }${col#}"
    3.55  		continue ;;	# built-in column name
    3.56 @@ -3836,15 +3854,23 @@
    3.57  			 h=${cnd%%=*} v=${cnd#*=}
    3.58  			 h=`sqlquotestr "$h"`
    3.59  			 v=`sqlquotestr "$v"`
    3.60 -			 valvar="CASE val WHEN $h THEN $v END"
    3.61 +			 if [ x"$fromtbl" = x"b" ]; then
    3.62 +			   valvar="CASE val WHEN $h THEN $v END"
    3.63 +			 else
    3.64 +			   valvar="$h"
    3.65 +			 fi
    3.66  			 as=${as%%:*} ;;
    3.67  		esac
    3.68  		;;
    3.69        *)	as=${col} ;;
    3.70      esac
    3.71      ss=`printf "$substr" "$valvar"`
    3.72 -    eav=$eav${eav:+,}" max(case key when '$col' then $ss end) as $as"
    3.73 -    scols="$scols${scols:+, }b.$as"
    3.74 +    if [ x"$fromtbl" = x"b" ]; then
    3.75 +      eav=$eav${eav:+,}" \"$as:\"||coalesce(max(case key when '$col' then $ss end), '') as $as"
    3.76 +    else
    3.77 +      eav=$eav${eav:+,}" \"$as:\"||$ss as $as"
    3.78 +    fi
    3.79 +    scols="$scols${scols:+, }${fromtbl}.$as"
    3.80    done
    3.81  #case author when '$user' then a.rowid else '---' end as ID,
    3.82    if [ -n "$DT_SQL" ]; then
    3.83 @@ -3877,7 +3903,7 @@
    3.84      ## $ddd LINE exists at the end of this function
    3.85    fi
    3.86    printf '.mode list\n.header 0\n' >> $sqlfile
    3.87 -  cat<<EOF | sed "s,\(<TR><TD>\)\([1-9][0-9]*\)\(#[0-9a-fxs]*\)*</TD>,\1$elink$dvlink</TD>," | dt_rowhack
    3.88 +  cat<<EOF | sed "s,\(<TR><TD>\)\([1-9][0-9]*\)\(#[0-9a-fxs]*\)*</TD>,\1$elink$dvlink</TD>," | dt_colhack | dt_rowhack
    3.89  <div> <!-- for folding by check button (s4-funcs.sh:dumptable()) -->
    3.90  <div class="dumptable">
    3.91  <table class="b$dt_class">
     4.1 --- a/s4-main.js	Tue Dec 22 10:58:03 2020 +0900
     4.2 +++ b/s4-main.js	Thu Dec 24 19:42:58 2020 +0900
     4.3 @@ -1,3 +1,4 @@
     4.4 +// 愛
     4.5  (function (){
     4.6      function collectElementsByAttr(elm, attr, val) {
     4.7  	var e = document.getElementsByTagName(elm);
     4.8 @@ -306,11 +307,69 @@
     4.9  	    }, null);
    4.10  	}
    4.11      }
    4.12 +    function initGrphome() {
    4.13 +	console.log("initGrphome");
    4.14 +	let btn = document.querySelectorAll("button.toggle-frozen");
    4.15 +	if (!btn) return;
    4.16 +	let url = document.URL,
    4.17 +	    mypath = url.substring(url.lastIndexOf("/"));
    4.18 +	if (mypath.match(/(.*)\/(.*)/)) {
    4.19 +	    mypath = RegExp.$2;
    4.20 +	    mypath = mypath.substring(0, mypath.lastIndexOf("?"));
    4.21 +	    //alert("mypath="+mypath);
    4.22 +	} else return;
    4.23 +
    4.24 +	function toggleFrozen(e, rowid) {
    4.25 +	    let tgt = mypath+"?blog_setfrozen+"+rowid;
    4.26 +	    let tr = e.target.parentNode.parentNode;
    4.27 +	    fetch(tgt, {
    4.28 +		method: "POST",
    4.29 +		headers: {'Content-Type': 'text/html; charset=utf-8'},
    4.30 +	    }).then(function(resp) {
    4.31 +		return resp.text();
    4.32 +	    }).then(function(tbody) {
    4.33 +		try {
    4.34 +		    var json = JSON.parse(tbody);
    4.35 +		} catch (e) {
    4.36 +		    return;
    4.37 +		}
    4.38 +		let state = json.state, newstate;
    4.39 +		if (json.alert) {
    4.40 +		    alert(json.alert)
    4.41 +		}
    4.42 +		if (state.match(/frozen/i)) {
    4.43 +		    newstate = "凍結";
    4.44 +		} else {
    4.45 +		    newstate = null;
    4.46 +		}
    4.47 +		tr.setAttribute("class", newstate);
    4.48 +	    });
    4.49 +	}
    4.50 +	for (let b of btn) {
    4.51 +	    let rowid = null;
    4.52 +	    let td=b.parentNode, tr = td.parentNode;
    4.53 +	    for (let a of tr.querySelectorAll("a[href]")) {
    4.54 +		if (a.getAttribute("href").match(/\?replyblog\+([0-9]+)/)) {
    4.55 +		    rowid = parseInt(RegExp.$1);
    4.56 +		    break;
    4.57 +		}
    4.58 +	    }
    4.59 +	    if (rowid && rowid>0) {
    4.60 +		b.addEventListener("click", function(e) {
    4.61 +		    if (!btn) return;
    4.62 +		    toggleFrozen(e, rowid);
    4.63 +		}, false);
    4.64 +		b.setAttribute("title", "稼動/凍結をその場で切り替えます\n\
    4.65 +Toggle Running/Frozen ("+rowid+")");
    4.66 +	    }
    4.67 +	}
    4.68 +    }
    4.69      function init() {
    4.70  	initGrpAction();
    4.71  	initBlogs();
    4.72  	initFileInput();
    4.73  	initTextarea();
    4.74 +	initGrphome();
    4.75      }
    4.76      document.addEventListener('DOMContentLoaded', init, null);
    4.77  })();
     5.1 --- a/scripts/s4-sns.case	Tue Dec 22 10:58:03 2020 +0900
     5.2 +++ b/scripts/s4-sns.case	Thu Dec 24 19:42:58 2020 +0900
     5.3 @@ -46,7 +46,7 @@
     5.4      echo "Refresh: 0; $newurl"; echo
     5.5      exit 0
     5.6      ;;
     5.7 -  lshandout|lshandoutall|gethandout|gethandoutcsv|gethandoutcsv2|blogseen|getteamcsv)
     5.8 +  lshandout|lshandoutall|gethandout|gethandoutcsv|gethandoutcsv2|blogseen|getteamcsv|blog_setfrozen)
     5.9      case "$stage" in
    5.10        lshandout*|blogseen*) contenttype; echo ;;
    5.11      esac