changeset 825:e9817a71f332

List groups in other worlds
author HIROSE Yuuji <yuuji@gentei.org>
date Sun, 21 Jun 2020 09:50:32 +0900
parents fcf485cbabc6
children f2d69fb3e038
files examples/common/default/default.css s4-funcs.sh s4-world.sh
diffstat 3 files changed, 89 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/examples/common/default/default.css	Sat Jun 20 18:18:17 2020 +0900
+++ b/examples/common/default/default.css	Sun Jun 21 09:50:32 2020 +0900
@@ -344,6 +344,7 @@
 li.casmenu:hover div, li.casmenu:active div,
 li.casmenu div:hover, li.casmenu div:active
 {display: block;}
+span.pre {white-space: pre;}
 
 /*
  * PR Web
--- a/s4-funcs.sh	Sat Jun 20 18:18:17 2020 +0900
+++ b/s4-funcs.sh	Sun Jun 21 09:50:32 2020 +0900
@@ -32,7 +32,8 @@
 tmpfiles=""
 querylog=${QUERYLOG:-$logdir/query.log}
 searchlog=${SEARCHLOG:-$logdir/search.log}
-db=${DB:-$dbdir/cgi.sq3}
+defaultdb=$dbdir/cgi.sq3
+db=${DB:-$defaultdb}
 sessdb=${SESSDB:-$dbdir/sess.sq3}
 userupdateflag=$dbdir/userupdate
 sesstb=tmp.sess
@@ -2334,7 +2335,7 @@
   fi
   ) > $hometail &		# Is background call safe to m4??
   #
-  listgroupbytable $formdir/grp.def $cond |
+  listgroupbytable $formdir/grp.def "$cond" $uname |
       _m4 -D_BODYCLASS_=home -D_TITLE_="spaste(\`$tf')" \
 	  -D_PROFILE_="spaste(\`$pf')$usermenu" \
 	  -D_PROFIMG_="spaste(\`$imf')" \
@@ -2361,16 +2362,12 @@
   fi
 }
 listgroupbytable() {
-  # $1=deffile $2...=condition
-  tagline=`grep :tag: $1`; shift
-  and="${1:+and }" where=${1:+where }
+  # $1=deffile $2...=condition $3(optional)=uname
+  tagline=`grep :tag: $1`;
+  and="${2:+and }" where=${2:+where }
   href="<a href=\"$myname?grp+"
   echo '<div class="listgroup">'
-  NGsql="select distinct tag from\
-	(select gname, max(case key when 'tag' then val end) as tag, \
-	  max(case key when 'ctime' then val end) as ctime\
-	 from grp_s group by gname order by ctime);"
-  sql="select val from grp_s where key='tag' $and$* group by val;"
+  sql="select val from grp_s where key='tag' $and$2 group by val;"
 ## err ListGRP: query sql="$sql"
   for tag in `query "$sql"`
   do
@@ -2384,7 +2381,7 @@
 	 max(case key when 'gecos' then val end) as '説明',
 	 max(case key when 'tag' then val end) as 'tag',
 	 max(case key when 'mtime' then val end) as mtime from grp_s
-	 $where$* group by gname having tag='$tag' order by mtime desc);"
+	 $where$2 group by gname having tag='$tag' order by mtime desc);"
 ## err PersonalGroupList= `echo $sql`
     echo "<h2>$tn</h2>"
     echo '<table class="b listgroup">'
@@ -2392,6 +2389,9 @@
       | sed "s,\(<TR><TD>\)\([0-9]*\):\([^<]*\)</TD>,\1$href\2\">\3</a>,"
     echo '</table>'
   done
+  if [ -n "$S4WORLDLIST" -a -n "$3" ]; then
+    peekgrpworlds mem="$3"
+  fi
   echo '</div>'
 }
 iconhref() (
@@ -2550,7 +2550,7 @@
     # limit=3
     hiddens=$hiddens" "`cgi_hidden tag2 "$tag"`
   fi
-  if [ $total -gt $limit ]; then
+  if [ $total -gt $limit -o \( -n "$S4WORLDLIST" -a x"$tbl" = x"grp" \) ]; then
     echo '<div>'
     METHOD=GET cgi_form $stage <<EOF
 $form
@@ -2633,6 +2633,9 @@
   done
   echo "</div>"					# End of List-entry div
   echo ${pnbtn:+"<hr>$nextbtn$prevbtn"}
+  if [ -n "$kwd" -a x"$tbl" = x"grp" -a -n "$S4WORLDS" ]; then
+    peekgrpworlds kwd="$kwd"
+  fi
 )
 listmember() {
   listentry user "$@"
--- a/s4-world.sh	Sat Jun 20 18:18:17 2020 +0900
+++ b/s4-world.sh	Sun Jun 21 09:50:32 2020 +0900
@@ -164,3 +164,76 @@
 	EOF
   return $rc
 }
+
+getworldDB() {	# $1=conf
+  (unset DB; . "$1"; echo ${DB:-$defaultdb})
+}
+
+worldnameDBlist() {
+  echo Base:Base:`getworldDB ./s4-config.sh`
+  for w in $S4WORLDLIST; do
+    case "$w" in
+      *:*:*:*)	continue ;;
+      *:*:*)	w=${w%:*}; name=${w%:*}; world=${w#*:} ;;
+      *)	continue ;;
+    esac
+    d=`getworldDB "./s4-config-$world.sh"`
+    test -s "$d" && echo ${world}:${name}:$d
+  done
+}
+
+grepgrpworld() (
+  world=$1; wname=$2; kwd=$3; db=$4 cond=$5
+  case $world in
+    Base)	cgi=`basename ${S4MASTERURL:-$URL}` ;;
+    *)		cgi=s4-world-$world$cgiext ;;
+  esac
+  query <<-EOF |
+	ATTACH DATABASE "$db" AS td;
+	SELECT DISTINCT td.grp.rowid,hex(gname)
+	FROM td.grp NATURAL JOIN td.grp_mem
+	WHERE $cond;
+	DETACH DATABASE td;
+	EOF
+  while IFS='|' read rowid hgname; do
+    # echo rowid=$rowid - `echo "$hgname"|unhexize|htmlescape`
+    htmlgn=`echo $hgname|unhexize|htmlescape`
+    printf '<a href="%s?grp+%d">%s</a> ' "$cgi" "$rowid" "$htmlgn"
+  done | {
+    read ans
+    if [ -n "$ans" ]; then
+      w=`echo $wname|htmlescape`
+      cat<<-EOF
+	<tr>
+	 <tr><td><a href="$cgi?grps"><span class="pre">$w</span></a></td>
+	 <td>$ans</td>
+	</dl>
+	EOF
+    fi
+  }
+)
+
+peekgrpworlds() (
+  # $1=(kwd=Pattern|mem=User)
+  arg=${1#*=}
+  case $1 in
+    kwd=*) cond="gname LIKE '%$arg%'"
+	   guide="`echo $arg|htmlescape` を含むグループは別世界にもあります" ;;
+    mem=*) cond="user = '$arg'"
+	   guide="別世界の所属グループ";;
+  esac
+  for wd in `worldnameDBlist`; do
+    world=${wd%%:*}; wd=${wd#*:}
+    worldname=${wd%:*}
+    d=${wd#*:}
+    if [ ! $db -ef $d -a -s $d ]; then
+      grepgrpworld "$world" "$worldname" "$1" "$d" "$cond"
+    fi
+  done | {
+    result=`cat`
+    if [ -n "$result" ]; then
+      echo "<h2>$guide</h2>"
+      echo "<table class=\"b\">$nl $result$nl</table>"
+    fi
+  }
+)

yatex.org