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});
}
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.
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,
};
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),
};
}
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
+<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 />
<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">