changeset 837:a6462eea48be

Multiple files upload for tablets added and file renaming fixed
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 25 Jun 2020 15:50:16 +0900
parents b3516ee2bb4d
children 985ee9a09783
files examples/common/default/default.css s4-blog.sh s4-cgi.sh s4-funcs.sh s4-main.js
diffstat 5 files changed, 95 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/examples/common/default/default.css	Tue Jun 23 12:58:31 2020 +0900
+++ b/examples/common/default/default.css	Thu Jun 25 15:50:16 2020 +0900
@@ -55,6 +55,7 @@
 input[type="radio"][value="replace"]:checked +  input.replace[type="file"] {
     visibility: visible;
 }
+button#morefile {visibility: hidden; background: #fe9;}
 label.admin span {border-bottom: 1px solid blue;}
 label.admin:after {content: "(ADMIN)"; color: red; text-decoration: none;}
 
--- a/s4-blog.sh	Tue Jun 23 12:58:31 2020 +0900
+++ b/s4-blog.sh	Thu Jun 25 15:50:16 2020 +0900
@@ -565,18 +565,21 @@
   filehelp="《添付の注意》
 $file_accept_help"
   ntmode="通知モード=$blog_notify${blog_team:+ (team=$blog_team)}"
-  textform='<div class="fold">
+  textform=$(cat<<-EOF
+<div class="fold">
 <input type="checkbox" id="cmt" checked><label
  accesskey="c" title="C" for="cmt">コメントする</label><div>
 <table class="b">
-<tr><td><textarea id="text" name="text" cols="72" rows="4" title="'"$help"'">
-</textarea>'"$touchhelp</td></tr>
-<tr><td>添付ファイル(${filesize_max_MB}以下):"'
-<input type="file" name="image"'" $file_accept title=\"$filehelp\" multiple></td></tr>"'
+<tr><td><textarea id="text" name="text" cols="72" rows="4" title="$help">
+</textarea>$touchhelp</td></tr>
+<tr><td>添付ファイル(${filesize_max_MB}以下):
+`cgi_file image "" "$file_accept title=\"$filehelp\" multiple"`
+</td></tr>
 </table>
-<input type="submit" value="送信"'" class=\"$blog_notify\" title=\"$ntmode\""'>
+<input type="submit" value="送信" class="$blog_notify" title="$ntmode">
 <input type="reset" value="リセット"></div></div>
-'
+EOF
+	)
   cat<<-EOF
 	</table> <!-- end of s4-blog:blog_showentry() main table -->
 	<p class="update_link"><a
--- a/s4-cgi.sh	Tue Jun 23 12:58:31 2020 +0900
+++ b/s4-cgi.sh	Thu Jun 25 15:50:16 2020 +0900
@@ -57,6 +57,12 @@
   # $1=name $2=val(as filename) $3=args(if any)
   ## err cgi_file: \$1=$1 \$2=$2 \$3="[$3]"
   # Using global variable $dir
+  case "$3" in
+    *multiple*)
+      onemore='<button type="button" id="morefile" title="More attachment file">添付追加</button>'
+      multiple="$nl$onemore"
+      ;;
+  esac
   if [ -n "$2" -a -s "$dir/$2" ]; then
     file=$dir/$2
     bn=${file##*/}
@@ -66,13 +72,14 @@
   fi
   cat<<EOF
  ${icon}
-<input type="file" name="$1" value="$bn" $3>
+<input type="file" name="$1" value="$bn" $3>$multiple
 EOF
 )
 cgi_multi() (
   # $1=name $2=dir $3=func $4=args...
   # `dir' should contain $name.count and $name.N where N is 1 upto N
   i=1 name=$1 dir=$2 func=$3
+  argnomulti=`echo "$4"|sed 's/multiple//'` # No multiple for Replaced entres
   n=`cat $dir/$name.count`
   case "$func" in
     *file) addrename=yes ;;
@@ -82,21 +89,26 @@
     file=$name.$i
     vname=$file.`cat "$dir/$file.rowid"`
     val="`cat $dir/$file`"
+    if [ -n "$addrename" ]; then
+      # ${var:+..} cannot be used for inside-quotes incompatibility of shells
+      ren1="<input class=\"action\" type=\"radio\" name=\"action.$vname\"
+	id=\"mv.$vname\" value=\"mv\"><label for=\"mv.$vname\"
+	title=\"Rename\">名前変更</label>"
+      ren2="<input class=\"mv\" type=\"text\" name=\"mv.$vname\" value=\"$val\">"
+    fi
     cat<<EOF
  <tr><td>($i)</td><td>
 <input class="action" type="radio" name="action.$vname" id="keep.$vname"
  value="keep"><label for="keep.$vname" title="Keep">温存</label>
 <input class="action" type="radio" name="action.$vname" id="edit.$vname"
  value="edit"><label for="edit.$vname" title="Replace">修正</label>
-${addrename:+<input class="action" type="radio" name="action.$vname"
- id="mv.$vname" value="mv"><label for="mv.$vname"
-  title="Rename">名前変更</label>}
+$ren1
 <input class="action" type="radio" name="action.$vname" id="rm.$vname"
  value="rm"><label for="rm.$vname" title="Remove">削除</label>
 <label class="confirm" title="OK?">本当に消します<input class="confirm" type="checkbox"
  name="confirm.$vname" value="yes">はい</label><br>
-`$func $vname "$val" "$4"`<span>$val</span>
-${addrename:+<input class="mv" type="text" name="mv.$vname" value="$val">}
+`$func $vname "$val" "$argnomulti"`<span>$val</span>
+$ren2
 </td></tr>
 EOF
     i=$((i+1))
--- a/s4-funcs.sh	Tue Jun 23 12:58:31 2020 +0900
+++ b/s4-funcs.sh	Thu Jun 25 15:50:16 2020 +0900
@@ -63,7 +63,7 @@
 filesize_max=$((5*1024*1024))
 filesize_max_MB="$((filesize_max/1024/1024))MB"
 file_accept='accept="image/*,text/*,audio/*,application/vnd.oasis.*,application/pdf,application/x-*"'
-file_accept='accept=".jpg,.jpeg,.gif,.png,.tiff,.pdf,.odt,.ods,.odp,.odg,.mp3,.mp4,.avi,.ogg,.mov,.webm,.gpx,.json,.geojson,.kml,.html,.css,.rb,.c,.txt,.zip,.xcf,.bz2,.gz,.xz,.7z,.csv,.dat"'
+file_accept='accept=".jpg,.jpeg,.gif,.png,.tiff,.pdf,.odt,.ods,.odp,.odg,.mp3,.mp4,.avi,.ogg,.mov,.webm,.gpx,.json,.geojson,.kml,.html,.css,.rb,.c,.h,.txt,.tex,.sty,.zip,.xcf,.bz2,.gz,.xz,.7z,.csv,.dat"'
 file_accept_egrep='^(text/|message/|image/|audio/|video/|application/(vnd.oasis|pdf|epub|xml|zip|[xz]-))'
 file_accept_help="
 添付可能ファイル: テキスト、画像、音声、動画、ODF、PDF、
@@ -2941,7 +2941,7 @@
 	fi
 	subj=`getpar subject`
 	afiles=""
-	for fn in `query "SELECT DISTINCT val FROM par WHERE var='files' AND sessid='$session';"`
+	for fn in `query "SELECT DISTINCT val FROM par WHERE var='image' AND sessid='$session';"`
 	do
 	  f=$tmpd/$fn
 	  if [ -s $f ]; then
@@ -3144,7 +3144,7 @@
 <tr><td>Subject: </td><td>`cgi_text subject`</td></tr>
 <tr><td>追加宛先(通常空欄): </td><td>`cgi_text supprcpt ""`</td></tr>
 <tr><td>ファイル添付: </td>
-    <td>`cgi_file files "" "multiple $file_accept title=\"$file_accept_help\""`<br><small>文書ファイルはPDFに変換してから</small></td></tr>
+    <td>`cgi_file image "" "multiple $file_accept title=\"$file_accept_help\""`<br><small>文書ファイルはPDFに変換してから</small></td></tr>
 </table>
 <p>(下記一覧から1人以上選択していない場合は送れません`cgi_submit 確認後送信`)</p>
 </div>
@@ -3822,6 +3822,16 @@
 	DELETE FROM article WHERE id IN (SELECT id FROM orphanedarticle);
 	EOF
 }
+
+clearcachedir() (
+  td=`getcachedir "$1"`
+  err td=$td: ls- `ls $td`
+  if [ -w "$td/image.1" ]; then
+    err Removing td=$td
+    rm -fr $td/		# Clear icon-image cache!
+  fi
+)
+
 par2table() (
   # copy current parameters of par into destination table
   # $1=definition-file
@@ -3876,6 +3886,7 @@
     if [ x"$rm" = x"yes" ]; then
       if [ x"$rm$cfm" = x"yesyes" ]; then
 	query "delete from $tbl where rowid=$rowid;"
+	clearcachedir "$tbl/$rowid"
 	if [ x"$tbl" = x"grp" -o x"$tbl" = x"blog" ]; then
 	  clean-orphaned
 	fi
@@ -4022,17 +4033,18 @@
 	      # regularize filename and strip directory part
 	      newname=`getpar mv.$v|tr -d '":;#<>?^%$!'|tr -d "'"|tr ' ' _`
 	      newname=`basename $newname`
-	      err "newname($v)=$newname"
-	      newext="${newname##*.}"
-	      if test x"$newname" != x"$newext" \
-		  && echo "${file_accept#*=}" \
-		    | fgrep -w "$newext" >/dev/null 1>&2
+	      oldname=`query "SELECT val FROM $tb2 WHERE rowid=$st_rowid;"`
+	      oldext=`expr "$oldname" : '.*\.\(.*\)'`
+	      newext=`expr "$newname" : '.*\.\(.*\)'`
+	      err "p2t(mv): oldname=$oldname $oldext -> newname($v)=$newname $newext"
+	      if [ -n "$newname" -a x"$oldext" = x"$newext" ];
 	      then
 		newsql="UPDATE $tb2 SET val='$newname'"
 	      else
 		html p<<-EOF
 		$newname は取り扱えないファイル名です。
-		空白を含まない名前で拡張子を正しくつけて下さい。
+		空白を含まない名前にして下さい。
+		拡張子の変更もできません。
 		EOF
 		continue
 	      fi
@@ -4043,6 +4055,7 @@
 	  esac
 	  # err newsql=$newsql
 	  sql=$sql$nl"$newsql where rowid=$st_rowid;"
+	  clearcachedir "$tbl/$rowid"
 	done
 
 	if [ x"$bin" = x"NULL" ]; then
@@ -4082,6 +4095,7 @@
 	## err $col=$val
 	bin=NULL
 	## err partype$col=`getpartype $col "$limit"`
+	ptype=`getpartype $col "$limit"` # partype should be obtained each time
         case $ptype in
 	  file) file=$tmpd/`getparfilename $col "$limit"`
 		## err parfile-$col=$file
--- a/s4-main.js	Tue Jun 23 12:58:31 2020 +0900
+++ b/s4-main.js	Thu Jun 25 15:50:16 2020 +0900
@@ -72,8 +72,49 @@
 	    u.checked = !u.checked;
 	}
     }
+    function addFileInput() {
+	var inpfile = collectElementsByAttr("input", "name", "image");
+	if (!inpfile) return;
+	var filled = true;
+	var i, ih;
+	for (i of inpfile) {
+	    if (! i.value) filled=false;
+	}
+	if (filled) {
+	    ih = i.parentNode.innerHTML;
+	    if (ih) {
+		var inpf = ih.substring(ih.indexOf("<input")),
+		    newi = "<br>"+inpf.substring(0, inpf.indexOf(">")+1);
+		i.insertAdjacentHTML("afterend", newi)
+		// alert(newi);
+	    }
+	}
+    }
+    function initFileInput() { // Multiplies "input type=file"
+	var el, morefile = document.getElementById("morefile");
+	if (morefile) {
+	    for (el of collectElementsByAttr("input", "name", "image")) {
+		el.addEventListener("change", function(ev) {
+		    if (ev.target.value > "" && ev.target.files.length == 1)
+			morefile.style.visibility = "visible";
+		    // No need to hide again, sure?
+		});
+	    }
+	    morefile.addEventListener("click", addFileInput, null);
+	}
+	// When renaming, select basename part
+	for (el of collectElementsByAttr("input", "class", "mv")) {
+	    el.addEventListener("focus", function(ev) {
+		var i = ev.target;
+		if (i) {
+		    i.setSelectionRange(0, i.value.lastIndexOf("."));
+		}
+	    });
+	}
+    }
     function initBlogs() {
-	var el, check = collectElementsByAttr("input", "name", "notifyto");
+	// Auto-complete #xxxx
+	var check = collectElementsByAttr("input", "name", "notifyto");
 	if (check)
 	    for (let i of check) {
 		i.addEventListener("click", insertRedirect, null);
@@ -138,6 +179,7 @@
     function init() {
 	initGrpAction();
 	initBlogs();
+	initFileInput();
     }
     document.addEventListener('DOMContentLoaded', init, null);
 })();

yatex.org