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