# HG changeset patch # User HIROSE Yuuji # Date 1608806578 -32400 # Node ID 5843755e3b309e5604f72e94acdc243404895948 # Parent 7ca1f11ab5e8996b5fa1f8dcdd55487bfed1b454 The beginning of AJAX operations Frozen/Running can be toggled by ajax button diff -r 7ca1f11ab5e8 -r 5843755e3b30 examples/common/default/default.css --- 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%;} diff -r 7ca1f11ab5e8 -r 5843755e3b30 s4-blog.sh --- 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` diff -r 7ca1f11ab5e8 -r 5843755e3b30 s4-funcs.sh --- 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='' 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,().*(),\1$frzbtn\2," + else + cat + fi + ## DO not convert to frzbtn when not admin echo " " getgname="(select gname from grp where rowid=$rowid)" @@ -3724,6 +3732,11 @@ showgroup $grid done } +dt_colhack() { + # FROM: xxx:yyy + # TO: yyy + sed -Ee 's,([^:<"]+):([^<]*)(|$),\2\3,g' +} dt_rowhack() { # From: # .... @@ -3737,7 +3750,7 @@ N /<\/TR>/ { s/\n// - s,^\(.*\)rowclass=\(.*\)\(\),\1\2\3, + s,^\(.*\)]*\)>rowclass=\(.*\)\(\),\1\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<\)\([1-9][0-9]*\)\(#[0-9a-fxs]*\)*,\1$elink$dvlink," | dt_rowhack + cat<\)\([1-9][0-9]*\)\(#[0-9a-fxs]*\)*,\1$elink$dvlink," | dt_colhack | dt_rowhack
diff -r 7ca1f11ab5e8 -r 5843755e3b30 s4-main.js --- 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); })(); diff -r 7ca1f11ab5e8 -r 5843755e3b30 scripts/s4-sns.case --- 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