diff --git a/wire/core/Pagefile.php b/wire/core/Pagefile.php index 22c8f5c1..ba8e6db5 100644 --- a/wire/core/Pagefile.php +++ b/wire/core/Pagefile.php @@ -763,7 +763,7 @@ class Pagefile extends WireData { * */ public function __toString() { - return $this->basename; + return (string) $this->basename; } /** diff --git a/wire/core/ProcessWire.php b/wire/core/ProcessWire.php index 1146ed1a..e273f436 100644 --- a/wire/core/ProcessWire.php +++ b/wire/core/ProcessWire.php @@ -45,7 +45,7 @@ class ProcessWire extends Wire { * Reversion revision number * */ - const versionRevision = 61; + const versionRevision = 62; /** * Version suffix string (when applicable) diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js index 5dbd19d1..7c15c375 100755 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js @@ -112,10 +112,10 @@ $(document).ready(function() { $("body").addClass("ie-no-drop"); // ?? $(document).on('change', '.InputfieldFileUpload input[type=file]', function() { - + var $t = $(this); - var $mask = $t.parent(".InputMask"); - + var $mask = $t.closest(".InputMask"); + if($t.val().length > 1) { $mask.addClass("ui-state-disabled"); } else { @@ -130,18 +130,22 @@ $(document).ready(function() { var maxFiles = parseInt($upload.find('.InputfieldFileMaxFiles').val()); var numFiles = $list.children('li').length + $upload.find('input[type=file]').length + 1; - if(maxFiles > 0 && numFiles >= maxFiles) return; + if(maxFiles > 0 && numFiles >= maxFiles) { + // no more files allowed + } else { + $upload.find(".InputMask").not(":last").each(function() { + var $m = $(this); + if($m.find("input[type=file]").val() < 1) $m.remove(); + }); - $upload.find(".InputMask").not(":last").each(function() { - var $m = $(this); - if($m.find("input[type=file]").val() < 1) $m.remove(); - }); - - // add another input - var $i = $mask.clone().removeClass("ui-state-disabled"); - $i.children("input[type=file]").val(''); - $i.insertAfter($mask); - $i.css('margin-left', '0.5em').removeClass('ui-state-active'); + // add another input + var $mask2 = $mask.clone().removeClass("ui-state-disabled"); + var $input = $mask2.find('input[type=file]'); + $input.attr('id', $input.attr('id') + '-'); + $input.val(''); + $mask2.insertAfter($mask); + $mask2.css('margin-left', '0.5em').removeClass('ui-state-active'); + } // update file input to contain file name var name = $t.val(); diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js index 9b90e1ab..599b4db6 100644 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js @@ -1 +1 @@ -$(document).ready(function(){$(document).on("change",".InputfieldFileDelete input",function(){a($(this))}).on("dblclick",".InputfieldFileDelete",function(){var i=$(this).find("input");var h=$(this).parents(".InputfieldFileList").find(".InputfieldFileDelete input");if(i.is(":checked")){h.removeAttr("checked").change()}else{h.attr("checked","checked").change()}return false});function a(j){var h=j.parents(".InputfieldFileInfo");var i=j.closest(".InputfieldFile").hasClass("InputfieldItemListCollapse");if(j.is(":checked")){h.addClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideUp("fast")}}else{h.removeClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideDown("fast")}}}function c(h){h.each(function(){var j=$(this);var k=j.children("li").length;if(j.closest(".InputfieldRenderValueMode").length){return}var i=j.closest(".Inputfield");if(k<2){if(k==0){i.addClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple InputfieldFileSingle")}else{i.addClass("InputfieldFileSingle").removeClass("InputfieldFileEmpty InputfieldFileMultiple")}return}else{j.closest(".Inputfield").removeClass("InputfieldFileSingle InputfieldFileEmpty").addClass("InputfieldFileMultiple")}j.sortable({start:function(m,l){l.item.children(".InputfieldFileInfo").addClass("ui-state-highlight")},stop:function(m,l){$(this).children("li").each(function(o){$(this).find(".InputfieldFileSort").val(o)});l.item.children(".InputfieldFileInfo").removeClass("ui-state-highlight");i.addClass("InputfieldFileJustSorted InputfieldStateChanged");setTimeout(function(){i.removeClass("InputfieldFileJustSorted")},500)}})}).find(".ui-widget-header, .ui-state-default").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")})}function d(){$("body").addClass("ie-no-drop");$(document).on("change",".InputfieldFileUpload input[type=file]",function(){var k=$(this);var p=k.parent(".InputMask");if(k.val().length>1){p.addClass("ui-state-disabled")}else{p.removeClass("ui-state-disabled")}if(p.next(".InputMask").length>0){return}var h=k.closest(".InputfieldFile");var m=k.closest(".InputfieldFileUpload");var l=h.find(".InputfieldFileList");var o=parseInt(m.find(".InputfieldFileMaxFiles").val());var j=l.children("li").length+m.find("input[type=file]").length+1;if(o>0&&j>=o){return}m.find(".InputMask").not(":last").each(function(){var r=$(this);if(r.find("input[type=file]").val()<1){r.remove()}});var q=p.clone().removeClass("ui-state-disabled");q.children("input[type=file]").val("");q.insertAfter(p);q.css("margin-left","0.5em").removeClass("ui-state-active");var i=k.val();var n=i.lastIndexOf("/");if(n===-1){n=i.lastIndexOf("\\")}i=i.substring(n+1);p.find(".ui-button-text").text(i).prepend("");p.removeClass("ui-state-active")})}function e(i){if(i.length>0){var h=i.find(".InputfieldFileUpload")}else{var h=$(".InputfieldFileUpload")}h.closest(".InputfieldContent").each(function(k){if($(this).hasClass("InputfieldFileInit")){return}j($(this),k);$(this).addClass("InputfieldFileInit")});function j(r,z){var q=r.parents("form");var k=r.closest(".InputfieldRepeaterItem");var n=k.length?k.attr("data-editUrl"):q.attr("action");n+=(n.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var D=q.find("input._post_token");var p=D.attr("name");var u=D.val();var B=r.find(".InputfieldFileUpload");var m=B.data("fieldname");m=m.slice(0,-2);var C=B.data("extensions").toLowerCase();var y=B.data("maxfilesize");var t=r.find("input[type=file]").get(0);var s=r.get(0);var l=r.find(".InputfieldFileList");if(l.size()<1){l=$("");r.prepend(l);r.parent(".Inputfield").addClass("InputfieldFileEmpty")}var A=l.get(0);var v=parseInt(r.find(".InputfieldFileMaxFiles").val());l.children().addClass("InputfieldFileItemExisting");r.find(".AjaxUploadDropHere").show();var w=null;function o(G){var J=$('
  • '),I=$('
    '),H=$('
    '),K,L,N,M;I.append(H);J.append(I);N=new XMLHttpRequest();N.upload.addEventListener("progress",function(O){if(O.lengthComputable){var P=(O.loaded/O.total)*100;H.width(P+"%");if(P>4){H.html(""+parseInt(P)+"%")}$("body").addClass("pw-uploading")}else{}},false);N.addEventListener("load",function(){N.getAllResponseHeaders();var U=$.parseJSON(N.responseText);if(U.error!==undefined){U=[U]}for(var S=0;S0){R.slideUp("fast",function(){R.remove()})}}var Z=r.find("input[type=file]");if(Z.val()){Z.replaceWith(Z.clone(true))}var W=$(P.markup);W.hide();if(P.overwrite){var Y=W.find(".InputfieldFileName").text();var aa=null;l.children(".InputfieldFileItemExisting").each(function(){if(aa===null&&$(this).find(".InputfieldFileName").text()==Y){aa=$(this)}});if(aa!==null){var V=W.find(".InputfieldFileInfo");var O=W.find(".InputfieldFileLink");var Q=aa.find(".InputfieldFileInfo");var X=aa.find(".InputfieldFileLink");Q.html(V.html()+"");X.html(O.html());aa.addClass("InputfieldFileItemExisting");aa.effect("highlight",500)}else{l.append(W);W.slideDown();W.addClass("InputfieldFileItemExisting")}}else{l.append(W);W.slideDown()}}}J.remove();if(w){clearTimeout(w)}w=setTimeout(function(){$("body").removeClass("pw-uploading");if(v!=1&&!l.is(".ui-sortable")){c(l)}l.trigger("AjaxUploadDone")},500)},false);N.open("POST",n,true);N.setRequestHeader("X-FILENAME",encodeURIComponent(G.name));N.setRequestHeader("X-FIELDNAME",m);N.setRequestHeader("Content-Type","application/octet-stream");N.setRequestHeader("X-"+p,u);N.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");N.send(G);M=" "+G.name+' • '+parseInt(G.size/1024,10)+" kb";J.find("p.ui-widget-header").html(M);l.append(J);var E=l.closest(".Inputfield");E.addClass("InputfieldStateChanged");var F=E.find(".InputfieldFileItem").length;if(F==1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else{if(F>1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}}function x(G){function H(J,K){return'
  •   '+J+' • '+K+"

  • "}if(typeof G!=="undefined"){for(var F=0,E=G.length;Fy&&y>2000000){l.append(H(G[F].name,"Filesize "+parseInt(G[F].size/1024,10)+" kb is too big. Maximum allowed is "+parseInt(y/1024,10)+" kb"))}else{o(G[F])}}if(v==1){break}}}else{A.innerHTML="No support for the File API in this web browser"}}t.addEventListener("change",function(E){x(this.files);E.preventDefault();E.stopPropagation();this.value=""},false);s.addEventListener("dragleave",function(){$(this).removeClass("ui-state-hover");$(this).closest(".Inputfield").removeClass("pw-drag-in-file")},false);s.addEventListener("dragenter",function(){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")},false);s.addEventListener("dragover",function(E){if(!$(this).is("ui-state-hover")){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")}E.preventDefault();E.stopPropagation()},false);s.addEventListener("drop",function(E){x(E.dataTransfer.files);$(this).removeClass("ui-state-hover").closest(".Inputfield").removeClass("pw-drag-in-file");E.preventDefault();E.stopPropagation()},false)}}c($(".InputfieldFileList"));if(window.File&&window.FileList&&window.FileReader&&($("#PageIDIndicator").length>0||$(".InputfieldAllowAjaxUpload").length>0)){e("")}else{d()}var g=767;var f=false;var b=function(){$(".AjaxUploadDropHere").each(function(){var h=$(this);if(h.parent().width()<=g){h.hide()}else{h.show()}});f=false};$(window).resize(function(){if(f){return}f=true;setTimeout(b,1000)}).resize();$(document).on("reloaded",".InputfieldHasFileList",function(h){c($(this).find(".InputfieldFileList"));e($(this));b()})}); \ No newline at end of file +$(document).ready(function(){$(document).on("change",".InputfieldFileDelete input",function(){a($(this))}).on("dblclick",".InputfieldFileDelete",function(){var i=$(this).find("input");var h=$(this).parents(".InputfieldFileList").find(".InputfieldFileDelete input");if(i.is(":checked")){h.removeAttr("checked").change()}else{h.attr("checked","checked").change()}return false});function a(j){var h=j.parents(".InputfieldFileInfo");var i=j.closest(".InputfieldFile").hasClass("InputfieldItemListCollapse");if(j.is(":checked")){h.addClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideUp("fast")}}else{h.removeClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideDown("fast")}}}function c(h){h.each(function(){var j=$(this);var k=j.children("li").length;if(j.closest(".InputfieldRenderValueMode").length){return}var i=j.closest(".Inputfield");if(k<2){if(k==0){i.addClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple InputfieldFileSingle")}else{i.addClass("InputfieldFileSingle").removeClass("InputfieldFileEmpty InputfieldFileMultiple")}return}else{j.closest(".Inputfield").removeClass("InputfieldFileSingle InputfieldFileEmpty").addClass("InputfieldFileMultiple")}j.sortable({start:function(m,l){l.item.children(".InputfieldFileInfo").addClass("ui-state-highlight")},stop:function(m,l){$(this).children("li").each(function(o){$(this).find(".InputfieldFileSort").val(o)});l.item.children(".InputfieldFileInfo").removeClass("ui-state-highlight");i.addClass("InputfieldFileJustSorted InputfieldStateChanged");setTimeout(function(){i.removeClass("InputfieldFileJustSorted")},500)}})}).find(".ui-widget-header, .ui-state-default").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")})}function d(){$("body").addClass("ie-no-drop");$(document).on("change",".InputfieldFileUpload input[type=file]",function(){var k=$(this);var r=k.closest(".InputMask");if(k.val().length>1){r.addClass("ui-state-disabled")}else{r.removeClass("ui-state-disabled")}if(r.next(".InputMask").length>0){return}var h=k.closest(".InputfieldFile");var m=k.closest(".InputfieldFileUpload");var l=h.find(".InputfieldFileList");var q=parseInt(m.find(".InputfieldFileMaxFiles").val());var j=l.children("li").length+m.find("input[type=file]").length+1;if(q>0&&j>=q){}else{m.find(".InputMask").not(":last").each(function(){var s=$(this);if(s.find("input[type=file]").val()<1){s.remove()}});var p=r.clone().removeClass("ui-state-disabled");var o=p.find("input[type=file]");o.attr("id",o.attr("id")+"-");o.val("");p.insertAfter(r);p.css("margin-left","0.5em").removeClass("ui-state-active")}var i=k.val();var n=i.lastIndexOf("/");if(n===-1){n=i.lastIndexOf("\\")}i=i.substring(n+1);r.find(".ui-button-text").text(i).prepend("");r.removeClass("ui-state-active")})}function e(i){if(i.length>0){var h=i.find(".InputfieldFileUpload")}else{var h=$(".InputfieldFileUpload")}h.closest(".InputfieldContent").each(function(k){if($(this).hasClass("InputfieldFileInit")){return}j($(this),k);$(this).addClass("InputfieldFileInit")});function j(r,z){var q=r.parents("form");var k=r.closest(".InputfieldRepeaterItem");var n=k.length?k.attr("data-editUrl"):q.attr("action");n+=(n.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var D=q.find("input._post_token");var p=D.attr("name");var u=D.val();var B=r.find(".InputfieldFileUpload");var m=B.data("fieldname");m=m.slice(0,-2);var C=B.data("extensions").toLowerCase();var y=B.data("maxfilesize");var t=r.find("input[type=file]").get(0);var s=r.get(0);var l=r.find(".InputfieldFileList");if(l.size()<1){l=$("");r.prepend(l);r.parent(".Inputfield").addClass("InputfieldFileEmpty")}var A=l.get(0);var v=parseInt(r.find(".InputfieldFileMaxFiles").val());l.children().addClass("InputfieldFileItemExisting");r.find(".AjaxUploadDropHere").show();var w=null;function o(G){var J=$('
  • '),I=$('
    '),H=$('
    '),K,L,N,M;I.append(H);J.append(I);N=new XMLHttpRequest();N.upload.addEventListener("progress",function(O){if(O.lengthComputable){var P=(O.loaded/O.total)*100;H.width(P+"%");if(P>4){H.html(""+parseInt(P)+"%")}$("body").addClass("pw-uploading")}else{}},false);N.addEventListener("load",function(){N.getAllResponseHeaders();var U=$.parseJSON(N.responseText);if(U.error!==undefined){U=[U]}for(var S=0;S0){R.slideUp("fast",function(){R.remove()})}}var Z=r.find("input[type=file]");if(Z.val()){Z.replaceWith(Z.clone(true))}var W=$(P.markup);W.hide();if(P.overwrite){var Y=W.find(".InputfieldFileName").text();var aa=null;l.children(".InputfieldFileItemExisting").each(function(){if(aa===null&&$(this).find(".InputfieldFileName").text()==Y){aa=$(this)}});if(aa!==null){var V=W.find(".InputfieldFileInfo");var O=W.find(".InputfieldFileLink");var Q=aa.find(".InputfieldFileInfo");var X=aa.find(".InputfieldFileLink");Q.html(V.html()+"");X.html(O.html());aa.addClass("InputfieldFileItemExisting");aa.effect("highlight",500)}else{l.append(W);W.slideDown();W.addClass("InputfieldFileItemExisting")}}else{l.append(W);W.slideDown()}}}J.remove();if(w){clearTimeout(w)}w=setTimeout(function(){$("body").removeClass("pw-uploading");if(v!=1&&!l.is(".ui-sortable")){c(l)}l.trigger("AjaxUploadDone")},500)},false);N.open("POST",n,true);N.setRequestHeader("X-FILENAME",encodeURIComponent(G.name));N.setRequestHeader("X-FIELDNAME",m);N.setRequestHeader("Content-Type","application/octet-stream");N.setRequestHeader("X-"+p,u);N.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");N.send(G);M=" "+G.name+' • '+parseInt(G.size/1024,10)+" kb";J.find("p.ui-widget-header").html(M);l.append(J);var E=l.closest(".Inputfield");E.addClass("InputfieldStateChanged");var F=E.find(".InputfieldFileItem").length;if(F==1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else{if(F>1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}}function x(G){function H(J,K){return'
  •   '+J+' • '+K+"

  • "}if(typeof G!=="undefined"){for(var F=0,E=G.length;Fy&&y>2000000){l.append(H(G[F].name,"Filesize "+parseInt(G[F].size/1024,10)+" kb is too big. Maximum allowed is "+parseInt(y/1024,10)+" kb"))}else{o(G[F])}}if(v==1){break}}}else{A.innerHTML="No support for the File API in this web browser"}}t.addEventListener("change",function(E){x(this.files);E.preventDefault();E.stopPropagation();this.value=""},false);s.addEventListener("dragleave",function(){$(this).removeClass("ui-state-hover");$(this).closest(".Inputfield").removeClass("pw-drag-in-file")},false);s.addEventListener("dragenter",function(){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")},false);s.addEventListener("dragover",function(E){if(!$(this).is("ui-state-hover")){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")}E.preventDefault();E.stopPropagation()},false);s.addEventListener("drop",function(E){x(E.dataTransfer.files);$(this).removeClass("ui-state-hover").closest(".Inputfield").removeClass("pw-drag-in-file");E.preventDefault();E.stopPropagation()},false)}}c($(".InputfieldFileList"));if(window.File&&window.FileList&&window.FileReader&&($("#PageIDIndicator").length>0||$(".InputfieldAllowAjaxUpload").length>0)){e("")}else{d()}var g=767;var f=false;var b=function(){$(".AjaxUploadDropHere").each(function(){var h=$(this);if(h.parent().width()<=g){h.hide()}else{h.show()}});f=false};$(window).resize(function(){if(f){return}f=true;setTimeout(b,1000)}).resize();$(document).on("reloaded",".InputfieldHasFileList",function(h){c($(this).find(".InputfieldFileList"));e($(this));b()})}); \ No newline at end of file diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module index fd64cf36..ae599fa6 100644 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module @@ -136,17 +136,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel || $this->wire('input')->get('reloadInputfieldAjax') || $this->wire('input')->get('renderInputfieldAjax'); - // get the max filesize - $filesize = trim(ini_get('post_max_size')); - $last = strtolower(substr($filesize, -1)); - if(ctype_alpha($last)) $filesize = rtrim($filesize, $last); - $filesize = (int) $filesize; - if($last == 'g') $this->maxFilesize = (($filesize*1024)*1024)*1024; - else if($last == 'm') $this->maxFilesize = ($filesize*1024)*1024; - else if($last == 'k') $this->maxFilesize = $filesize*1024; - else if((int) $filesize > 0) $this->maxFilesize = (int) $filesize; - else $this->maxFilesize = (5*1024)*1024; - + $this->setMaxFilesize(trim(ini_get('post_max_size'))); $this->uploadOnlyMode = (int) $this->wire('input')->get('uploadOnlyMode'); $this->addClass('InputfieldItemList', 'wrapClass'); $this->addClass('InputfieldHasFileList', 'wrapClass'); @@ -166,6 +156,41 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel if($key == 'deleteLabel') return $this->labels['delete']; return parent::get($key); } + + public function set($key, $value) { + if($key == 'maxFilesize') return $this->setMaxFilesize($value); + return parent::set($key, $value); + } + + /** + * Set the max file size in bytes or use string like "30m", "2g" "500k" + * + * @param int|string $filesize + * @return $this + * + */ + public function setMaxFilesize($filesize) { + if(ctype_digit("$filesize")) { + $this->maxFilesize = (int) $filesize; + } else { + $filesize = rtrim($filesize, 'bB'); // convert mb=>m, gb=>g, kb=>k + $last = strtolower(substr($filesize, -1)); + if(ctype_alpha($last)) $filesize = rtrim($filesize, $last); + $filesize = (int) $filesize; + if($last == 'g') { + $this->maxFilesize = (($filesize * 1024) * 1024) * 1024; + } else if($last == 'm') { + $this->maxFilesize = ($filesize * 1024) * 1024; + } else if($last == 'k') { + $this->maxFilesize = $filesize * 1024; + } else if($filesize > 0) { + $this->maxFilesize = $filesize; + } else { + $this->maxFilesize = (5 * 1024) * 1024; + } + } + return $this; + } /** * Per Inputfield interface, returns true when this field is empty