Mercurial > hgrepos > hgweb.cgi > s4
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); })();