s4
changeset 397:e9e8b4d40220
Add feature of `frozen state' of the blog board
author | HIROSE Yuuji <yuuji@gentei.org> |
---|---|
date | Tue, 27 Dec 2016 08:41:10 +0859 |
parents | cacd961d3405 |
children | f50d4df067b5 |
files | examples/common/default/default.css examples/sns/form/blog.def s4-blog.sh s4-funcs.sh |
diffstat | 4 files changed, 97 insertions(+), 18 deletions(-) [+] |
line diff
1.1 --- a/examples/common/default/default.css Sun Dec 25 11:55:51 2016 +0859 1.2 +++ b/examples/common/default/default.css Tue Dec 27 08:41:10 2016 +0859 1.3 @@ -84,6 +84,8 @@ 1.4 font-size: 150%; background: yellow; text-align: center; 1.5 white-space: pre-wrap; 1.6 } 1.7 +table.bloghead tr.frozen {background: blue; color: white;} 1.8 + 1.9 table.bloghead {margin-bottom: 1em;} 1.10 1.11 table.blog_replies, .blog_replies tr, .blog_replies td { 1.12 @@ -185,10 +187,14 @@ 1.13 div.lcto td:nth-child(2) {max-width: 8em;} 1.14 table.dumpblogs td:nth-child(5), /* team */ 1.15 table.dumpblogs td:nth-child(6), /* title */ 1.16 +table.dumpblogs td:nth-child(7), /* heading */ 1.17 div.lcto td:nth-child(3), /* title */ 1.18 div.lcto td:nth-child(4) /* owner */ 1.19 {max-width: 14em;} 1.20 1.21 +table.dumpblogs tr.凍結 td:nth-child(n+2) {opacity: 0.5;} 1.22 +table.dumpblogs tr.凍結 td:last-child {opacity: 1.0; color: blue;} 1.23 +*.frozen, *.凍結 {color: blue;} 1.24 1.25 /* 1.26 table.dumpblogs td:nth-child(4) {
2.1 --- a/examples/sns/form/blog.def Sun Dec 25 11:55:51 2016 +0859 2.2 +++ b/examples/sns/form/blog.def Tue Dec 27 08:41:10 2016 +0859 2.3 @@ -2,6 +2,7 @@ 2.4 用途:mode:s:select:普通の掲示板=normal レポート提出用(相互に参照可能)=report-open レポート提出用(管理者のみ参照可能)=report-closed 2.5 タイトル:title:s:text:maxlength="200" 2.6 コメント書込通知:notify:s:select:管理者のみに通知(グループの場合のみ)=admin 所有者全員に通知=all しない=no 2.7 +稼動状態:state:s:select:稼動=active 凍結(新規書込停止)=frozen 2.8 所有者:owner:s:owner: 2.9 筆者:author:s:author: 2.10 時刻:ctime:s:stamp:
3.1 --- a/s4-blog.sh Sun Dec 25 11:55:51 2016 +0859 3.2 +++ b/s4-blog.sh Tue Dec 27 08:41:10 2016 +0859 3.3 @@ -1,6 +1,10 @@ 3.4 # 3.5 type cgiinit >/dev/null 2>&1 || . ./s4-funcs.sh 3.6 3.7 +# Global error flags 3.8 +BLOG_NOTMEM=1 3.9 +BLOG_FROZEN=2 3.10 + 3.11 blog_genform() { 3.12 # 3.13 t=$1 3.14 @@ -8,8 +12,15 @@ 3.15 3.16 blog_writable() ( 3.17 # $1=articleid $2=user 3.18 + # Return: $?=0 - Writable 3.19 + # =1 - NOT Writable because user is not a member 3.20 + # =2 - NOT Writable because blog is frozen 3.21 blogowner=`getvalbyid blog owner "$1"` 3.22 - [ x"$blogowner" = x"$2" ] || isuser "$blogowner" || ismember "$2" "$blogowner" 3.23 + state=`getvalbyid blog state "$1"` 3.24 + rc=0 3.25 + [ x"$blogowner" = x"$2" ] || isuser "$blogowner" || ismember "$2" "$blogowner" || rc=$((rc+$BLOG_NOTMEM)) 3.26 + [ "$state" = "frozen" ] && rc=$((rc+$BLOG_FROZEN)) 3.27 + return $rc 3.28 ) 3.29 blog_readable() { 3.30 # $1=articleid $2=user 3.31 @@ -74,7 +85,19 @@ 3.32 ts=${tbl}_s tm=${tbl}_m 3.33 at=article as=article_s am=article_m 3.34 serial=$(($(date +%s)-1420038000))s$$ 3.35 - blog_writable $rowid $user && iswritable=true || iswritable=false 3.36 + blog_writable $rowid $user 3.37 + rc=$? 3.38 + if [ $rc = 0 ]; then 3.39 + iswritable=true 3.40 + ismem=true 3.41 + else 3.42 + iswritable=false 3.43 + if [ $((rc & $BLOG_NOTMEM)) -gt 0 ]; then 3.44 + ismem=false 3.45 + else 3.46 + ismem=true 3.47 + fi 3.48 + fi 3.49 # This function grasps blog entry definiton directly. 3.50 # blog: id 3.51 # blog_s: title,ctime,heading 3.52 @@ -88,7 +111,8 @@ 3.53 regmode=`getgroupattr $blogowner regmode` 3.54 # err regmode=$regmode 3.55 if [ x"$regmode" = x"moderated" ]; then 3.56 - if ! ismember $user $blogowner; then 3.57 + # if ! ismember $user $blogowner; then 3.58 + if ! $ismem; then 3.59 echo "加入してからどうぞ" | html p 3.60 return 3.61 fi 3.62 @@ -113,7 +137,7 @@ 3.63 EOF 3.64 3.65 href="<a href=\"?editheading+$rowid\" accesskey=\"e\" title=\"E\"> 編集 </a>" 3.66 - if $iswritable; then 3.67 + if $ismem; then 3.68 case `getvalbyid blog mode $rowid` in 3.69 *report*) 3.70 href2="<a href=\"?lshandout+$rowid\" accesskey=\"l\" title=\"L\"> 提出状況 </a>" 3.71 @@ -139,7 +163,7 @@ 3.72 { IFS='|' read edit ctime hexhead blogtype 3.73 cat<<-EOF 3.74 <tr><td>${edit:+$href }$ctime $blogtype $href2$href3 $href4</td></tr> 3.75 - <tr class="preface"> 3.76 + <tr class="preface${frozen_class:+ }$frozen_class"> 3.77 <td>`echo "$hexhead"|unhexize|hreflink|minitbl`</td></tr> 3.78 </table> 3.79 3.80 @@ -772,6 +796,21 @@ 3.81 fi 3.82 title=`getvalbyid blog title $rowid` 3.83 owner=`getvalbyid blog owner $rowid` 3.84 + if [ -z "$title" ]; then 3.85 + echo "日記番号指定が無効です。" | html p 3.86 + return 3.87 + fi 3.88 + blog_writable $rowid $user; rc=$? 3.89 + if [ $rc = 0 ]; then 3.90 + iswritable=true 3.91 + else 3.92 + iswritable=false 3.93 + if [ $((rc & $BLOG_FROZEN)) -gt 0 ]; then 3.94 + isfrozen=true 3.95 + frozen_class='frozen"' 3.96 + frozen_flag="<span class=\"$frozen_class\">[凍結]</span>" 3.97 + fi 3.98 + fi 3.99 if isuser "$owner"; then 3.100 subtitle="`gecos $owner` さんの話題" 3.101 else 3.102 @@ -785,14 +824,10 @@ 3.103 \"|htmlescape`" 3.104 memclass=`grp_getbodyclass "$owner"` 3.105 fi 3.106 - if [ -z "$title" ]; then 3.107 - echo "日記番号指定が無効です。" | html p 3.108 - return 3.109 - fi 3.110 3.111 text=`getpar text` 3.112 if [ -n "$text" ]; then 3.113 - if blog_writable $rowid $user; then 3.114 + if $iswritable; then 3.115 par2table $formdir/article.def 3.116 st=$? 3.117 case $st in 3.118 @@ -806,12 +841,16 @@ 3.119 ;; 3.120 esac 3.121 else 3.122 - title="$title(加入してないので書き込み不可)" 3.123 + if $isfrozen; then 3.124 + title="$title(凍結板につき書き込み不可)" 3.125 + else 3.126 + title="$title(加入してないので書き込み不可)" 3.127 + fi 3.128 fi 3.129 fi 3.130 def=$formdir/article.def 3.131 echo "$title" > $tmpd/title.$$ 3.132 - echo "$subtitle" > $tmpd/subtitle.$$ 3.133 + echo "$subtitle$frozen_flag" > $tmpd/subtitle.$$ 3.134 ${BLOG_SHOW:-blog_showentry} blog $rowid \ 3.135 | _m4 -D_TITLE_="spaste(\`$tmpd/title.$$')" \ 3.136 -D_BODYCLASS_=general"${memclass:+ $memclass}" \
4.1 --- a/s4-funcs.sh Sun Dec 25 11:55:51 2016 +0859 4.2 +++ b/s4-funcs.sh Tue Dec 27 08:41:10 2016 +0859 4.3 @@ -2198,9 +2198,10 @@ 4.4 `cgi_hidden owner $grp` 4.5 EOF 4.6 cond="where a.id in (select id from blog_s where key='owner' and val=$qgrp) order by ctime desc" 4.7 + colstate="state:稼動状態:frozen=rowclass=凍結" 4.8 DT_CHLD=article:blogid \ 4.9 DT_VIEW=replyblog dumptable html blog \ 4.10 - "ctime team title heading$colmd" "$cond" 4.11 + "ctime team title heading$colmd $colstate" "$cond" 4.12 4.13 getgname="(select gname from grp where rowid=$rowid)" 4.14 c="group by a.name having a.name in (select user from grp_mem where gname=$getgname)" 4.15 @@ -2895,6 +2896,26 @@ 4.16 showgroup $grid 4.17 done 4.18 } 4.19 +dt_rowhack() { 4.20 + # From: <TR> 4.21 + # .... 4.22 + # <TD>rowclass=foo</TD> 4.23 + # </TR> 4.24 + # To: <TR class="foo">....<TD>foo</TD></TR> 4.25 + sed -e ' 4.26 + /^<TR>/ { 4.27 + :loop 4.28 + s/\n// 4.29 + N 4.30 + /<\/TR>/ { 4.31 + s/\n// 4.32 + s,^<TR>\(.*\)<TD>rowclass=\(.*\)\(</TD></TR>\),<TR class="\2">\1<TD>\2\3, 4.33 + n 4.34 + } 4.35 + $p 4.36 + b loop 4.37 + }' 4.38 +} 4.39 dumptable() { 4.40 # $1=mode $2=Table $3=column-list-of-*_s(defaults to *) $4=conditions(if any) 4.41 # textのフィールドだけ全てダンプにしたほうがいいか 4.42 @@ -2923,16 +2944,28 @@ 4.43 # Construct join expression 4.44 eav="" scols="" 4.45 pk=`gettblpkey $2` 4.46 - substr=${dumpcollen:+"substr(val, 0, $dumpcollen)"} 4.47 - substr=${substr:-val} 4.48 + substr=${dumpcollen:+"substr(%s, 0, $dumpcollen)"} 4.49 + substr=${substr:-%s} 4.50 for col in ${3:-`gettbl_s_cols $2`}; do 4.51 + valvar=val 4.52 case $col in 4.53 gecos) scols="$scols${scols:+, }${col#}" 4.54 continue ;; # built-in column name 4.55 - *:*) col=${col%:*} as=${col#*:} ;; 4.56 + *:*) as=${col#*:} # as can be 稼動状態:frozen=凍結中 4.57 + col=${col%%:*} # stage:稼動状態:frozen=凍結中 -> stage 4.58 + case "$as" in 4.59 + *:*=*) cnd=${as#*:} 4.60 + h=${cnd%%=*} v=${cnd#*=} 4.61 + h=`sqlquotestr "$h"` 4.62 + v=`sqlquotestr "$v"` 4.63 + valvar="CASE val WHEN $h THEN $v END" 4.64 + as=${as%%:*} ;; 4.65 + esac 4.66 + ;; 4.67 *) as=${col} ;; 4.68 esac 4.69 - eav=$eav${eav:+,}" max(case key when '$col' then $substr end) as $as" 4.70 + ss=`printf "$substr" "$valvar"` 4.71 + eav=$eav${eav:+,}" max(case key when '$col' then $ss end) as $as" 4.72 scols="$scols${scols:+, }b.$as" 4.73 done 4.74 #case author when '$user' then a.rowid else '---' end as ID, 4.75 @@ -2945,7 +2978,7 @@ 4.76 then (SELECT gecos FROM gecoses WHERE name=val) END) as gecos 4.77 from ${2}_s c group by $pk) b on a.$pk=b.$pk $4;"} 4.78 ## err dt:SQL="`echo \"$presql$sql\"|tr -d '\n'`" 4.79 - cat<<EOF | sed "s,\(<TR><TD>\)\([1-9][0-9]*\)\(#[0-9a-fxs]*\)*</TD>,\1$elink$dvlink</TD>," 4.80 + cat<<EOF | sed "s,\(<TR><TD>\)\([1-9][0-9]*\)\(#[0-9a-fxs]*\)*</TD>,\1$elink$dvlink</TD>," | dt_rowhack 4.81 <div> <!-- for folding by check button (s4-funcs.sh:dumptable()) --> 4.82 <div class="dumptable"> 4.83 <table class="b$dt_class">