# HG changeset patch # User HIROSE Yuuji # Date 1593067816 -32400 # Node ID a6462eea48be307b84b6ace21a38a5bb178cb8bc # Parent b3516ee2bb4dab860539a7cd6c05ec8fd8d1e0cd Multiple files upload for tablets added and file renaming fixed diff -r b3516ee2bb4d -r a6462eea48be examples/common/default/default.css --- 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;} diff -r b3516ee2bb4d -r a6462eea48be s4-blog.sh --- 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='
+ textform=$(cat<<-EOF +
- -"' + +
'"$touchhelp
添付ファイル(${filesize_max_MB}以下):"' -
$touchhelp
添付ファイル(${filesize_max_MB}以下): +`cgi_file image "" "$file_accept title=\"$filehelp\" multiple"` +
- +
-' +EOF + ) cat<<-EOF

(下記一覧から1人以上選択していない場合は送れません`cgi_submit 確認後送信`)

@@ -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 diff -r b3516ee2bb4d -r a6462eea48be s4-main.js --- 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("")+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); })();