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">