diff options
-rw-r--r-- | IkiWiki/Plugin/attachment.pm | 43 | ||||
-rw-r--r-- | templates/editpage.tmpl | 85 |
2 files changed, 109 insertions, 19 deletions
diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm index 4bd08bf7b..cb4f4dcd6 100644 --- a/IkiWiki/Plugin/attachment.pm +++ b/IkiWiki/Plugin/attachment.pm @@ -119,11 +119,11 @@ sub formbuilder (@) { return if ! defined $form->field("do") || ($form->field("do") ne "edit" && $form->field("do") ne "create") ; - my $filename=Encode::decode_utf8($q->param('attachment')); - if (defined $filename && length $filename && - ($form->submitted eq "Upload Attachment" || $form->submitted eq "Save Page")) { + my $filename=Encode::decode_utf8($q->param('attachments')); + if (defined $filename && length $filename) { attachment_store($filename, $form, $q, $params{session}); } + if ($form->submitted eq "Save Page") { attachments_save($form, $params{session}); } @@ -240,6 +240,22 @@ sub attachment_store { IkiWiki::fast_file_copy($tempfile, $filename, $fh, @_); }); } + + # Return JSON response for the jquery file upload widget. + eval q{use JSON}; + error $@ if $@; + print "Content-type: application/json\n\n"; + my $size=-s $dest."/".$filename; + print to_json([ + { + name => $filename, + size => $size, + humansize => IkiWiki::Plugin::filecheck::humansize($size), + stored_msg => stored_msg(), + + } + ]); + exit 0; } # Save all stored attachments for a page. @@ -297,11 +313,12 @@ sub attachment_list ($) { my $std=sub { my $file=shift; my $mtime=shift; + my $date=shift; my $size=shift; - "field-select" => '<input type="checkbox" name="attachment_select" value="'.$file.'" />', + name => $file, size => IkiWiki::Plugin::filecheck::humansize($size), - mtime => displaytime($mtime), + mtime => $date, mtime_raw => $mtime, }; @@ -311,7 +328,7 @@ sub attachment_list ($) { if (! defined pagetype($f) && $f=~m/^\Q$loc\E[^\/]+$/) { $attachments{$f}={ - $std->($f, $IkiWiki::pagemtime{$f}, (stat($f))[7]), + $std->($f, $IkiWiki::pagemtime{$f}, displaytime($IkiWiki::pagemtime{$f}), (stat($f))[7]), link => htmllink($page, $page, $f, noimageinline => 1), }; } @@ -322,19 +339,21 @@ sub attachment_list ($) { my $heldmsg=gettext("this attachment is not yet saved"); foreach my $file (glob("$dir/*")) { next unless -f $file; - my $mtime=(stat(_))[9]; my $base=IkiWiki::basename($file); my $f=$loc.$base; $attachments{$f}={ - $std->($f, (stat($file))[9], (stat(_))[7]), - link => "<span title=\"$heldmsg\">$base</span>", + $std->($f, (stat($file))[9], stored_msg(), (stat(_))[7]), + link => $base, } } - # Sort newer attachments to the top of the list, so a newly-added - # attachment appears just before the form used to add it. - return sort { $b->{mtime_raw} <=> $a->{mtime_raw} || $a->{link} cmp $b->{link} } + # Sort newer attachments to the end of the list. + return sort { $a->{mtime_raw} <=> $b->{mtime_raw} || $a->{link} cmp $b->{link} } values %attachments; } +sub stored_msg { + gettext("just uploaded"); +} + 1 diff --git a/templates/editpage.tmpl b/templates/editpage.tmpl index d6ad80614..6fe495aa8 100644 --- a/templates/editpage.tmpl +++ b/templates/editpage.tmpl @@ -1,3 +1,5 @@ +<link rel="stylesheet" href="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery-ui.css" id="theme"> +<link rel="stylesheet" href="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.fileupload-ui.css"> <TMPL_VAR JAVASCRIPT> <TMPL_VAR MESSAGE> <br /> @@ -25,21 +27,90 @@ <TMPL_VAR HELPONFORMATTINGLINK> <TMPL_IF NAME="FIELD-ATTACHMENT"> <a class="toggle" href="#attachments">Attachments</a> -<div class="<TMPL_VAR ATTACHMENTS-CLASS>" id="attachments"> -<table> +<noscript> <tr><td colspan="5"><TMPL_VAR FIELD-ATTACHMENT><TMPL_VAR FIELD-UPLOAD></td></tr> -<TMPL_LOOP NAME="ATTACHMENT_LIST"> -<tr><td><TMPL_VAR FIELD-SELECT><TMPL_VAR LINK></td><td><TMPL_VAR SIZE></td><td><TMPL_VAR MTIME></td></tr> -</TMPL_LOOP> +</noscript> +<div class="<TMPL_VAR ATTACHMENTS-CLASS>" id="attachments"> +<div id="fileupload"> +<div class="fileupload-buttonbar"> +<label class="fileinput-button"> +<span>Add files...</span> +<input type="file" name="attachments" multiple> +</label> +<button type="submit" class="start">Start upload</button> +<button type="reset" class="cancel">Cancel upload</button> <TMPL_IF NAME="ATTACHMENT_LIST"> -<tr><td colspan="2"><TMPL_VAR FIELD-LINK><TMPL_VAR FIELD-RENAME><TMPL_VAR FIELD-REMOVE></td></tr> +<TMPL_VAR FIELD-LINK><TMPL_VAR FIELD-RENAME><TMPL_VAR FIELD-REMOVE> </TMPL_IF> +</div> +<script id="template-upload" type="text/x-jquery-tmpl"> + <tr class="template-upload{{if error}} ui-state-error{{/if}}"> + <td><input type="checkbox" name="dummy" />${name}</td> + <td>${sizef}</td> + {{if error}} + <td class="error" colspan="2">Error: + {{if error === 'maxFileSize'}}File is too big + {{else error === 'minFileSize'}}File is too small + {{else error === 'acceptFileTypes'}}Filetype not allowed + {{else error === 'maxNumberOfFiles'}}Max number of files exceeded + {{else}}${error} + {{/if}} + </td> + {{else}} + <td class="progress"><div></div></td> + <td class="start"><button>Start</button></td> + {{/if}} + <td class="cancel"><button>Cancel</button></td> + </tr> +</script> +<script id="template-download" type="text/x-jquery-tmpl"> + <tr class="template-download{{if error}} ui-state-error{{/if}}"> + <td><input type="checkbox" name="attachment_select" value="${name}" />${name}</td> + <td>${humansize}</td> + {{if error}} + <td class="error" colspan="2">Error: + {{if error === 1}}File exceeds upload_max_filesize (php.ini directive) + {{else error === 2}}File exceeds MAX_FILE_SIZE (HTML form directive) + {{else error === 3}}File was only partially uploaded + {{else error === 4}}No File was uploaded + {{else error === 5}}Missing a temporary folder + {{else error === 6}}Failed to write file to disk + {{else error === 7}}File upload stopped by extension + {{else error === 'maxFileSize'}}File is too big + {{else error === 'minFileSize'}}File is too small + {{else error === 'acceptFileTypes'}}Filetype not allowed + {{else error === 'maxNumberOfFiles'}}Max number of files exceeded + {{else error === 'uploadedBytes'}}Uploaded bytes exceed file size + {{else error === 'emptyResult'}}Empty file upload result + {{else}}${error} + {{/if}} + </td> + {{else}} + <td>${stored_msg}</td> + {{/if}} + </tr> +</script> +<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.min.js"></script> +<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery-ui.min.js"></script> +<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.tmpl.min.js"></script> +<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.iframe-transport.js"></script> +<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.fileupload.js"></script> +<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.fileupload-ui.js"></script> +<script> +$(function () { $('#fileupload').fileupload(); }); // initialize upload widget +</script> +<div class="fileupload-content"> +<table class="files"> +<TMPL_LOOP NAME="ATTACHMENT_LIST"> +<tr><td><input type="checkbox" name="attachment_select" value="<TMPL_VAR NAME ESCAPE="HTML">" /><TMPL_VAR LINK></td><td><TMPL_VAR SIZE></td><td><TMPL_VAR MTIME></td></tr> +</TMPL_LOOP> </table> </div> +</div> +</div> </TMPL_IF> <TMPL_VAR FORM-END> <TMPL_VAR WMD_PREVIEW> - <TMPL_IF NAME="PAGE_PREVIEW"> <hr /> <div class="header"> |