Changes for page Attachments

Last modified by Ludovic Dubost on 2024/07/22 15:50

From version 17.1
edited by Ludovic Dubost
on 2024/07/22 15:50
Change comment: Install extension [org.xwiki.platform:xwiki-platform-attachment-ui/16.5.0]
To version 4.1
edited by Ludovic Dubost
on 2017/02/07 23:57
Change comment: Install extension [org.xwiki.platform:xwiki-platform-attachment-ui-8.4.4]

Summary

Details

Page properties
Content
... ... @@ -1,21 +1,17 @@
1 1  {{velocity output="false"}}
2 -#set ($translationPrefix = 'xe.attachmentSelector')
3 -
4 4  #if ($request.xaction == 'postUpload')
5 5   #set ($targetDocument = $xwiki.getDocument($request.get('docname')))
6 6   #set ($targetAttachDocument = $xwiki.getDocument($request.get('targetdocname')))
7 7  
8 8   #set ($fieldname = $request.get('fieldname'))
9 - #set ($comment = $services.localization.render("${translationPrefix}.postUpload.comment", [$fieldname]))
10 10   #set ($docAction = $request.get('docAction'))
11 11   #set ($attachmentList = $targetAttachDocument.getAttachmentList())
12 12   #if ($attachmentList && $attachmentList.size() > 0)
13 - #set ($sortedAttachments = $collectiontool.sort($attachmentList, 'date:desc'))
10 + #set ($sortedAttachments = $sorttool.sort($attachmentList, 'date:desc'))
14 14   #set ($lastAttachment = $sortedAttachments.get(0))
15 15   #end
16 16   $response.sendRedirect($targetDocument.getURL($docAction, $escapetool.url({
17 17   $fieldname: $lastAttachment.filename,
18 - 'comment': $comment,
19 19   'form_token': $request.form_token
20 20   })))
21 21   #stop
... ... @@ -26,6 +26,7 @@
26 26  ##
27 27  ## Macros
28 28  ##
25 +#set ($translationPrefix = 'xe.attachmentSelector')
29 29  #set ($attachmentPickerDocName = 'XWiki.AttachmentSelector')
30 30  
31 31  $xwiki.ssx.use($attachmentPickerDocName)
... ... @@ -45,14 +45,11 @@
45 45   #end
46 46   (% class="gallery" %)(((
47 47   ## Only display the upload form if they have edit permission on targetAttachDocument
48 - #attachmentPicker_displayUploadForm($targetDocument, $targetAttachDocument, $options)
49 - #attachmentPicker_displayAttachmentGalleryEmptyValue($targetDocument, $targetAttachDocument, $options, $currentValue)
50 - #if ("$!services.temporaryAttachments" != '')
51 - #set ($unsortedAttachments = $services.temporaryAttachments.listAllAttachments($targetAttachDocument))
52 - #set ($sortedAttachments = $collectiontool.sort($unsortedAttachments, "${options.sortAttachmentsBy}"))
53 - #else
54 - #set ($sortedAttachments = $collectiontool.sort($targetAttachDocument.getAttachmentList(), "${options.sortAttachmentsBy}") )
45 + #if ($xwiki.hasAccessLevel('edit',$xcontext.user,${targetAttachDocument.fullName}))
46 + #attachmentPicker_displayUploadForm($targetDocument, $targetAttachDocument, $options)
55 55   #end
48 + #attachmentPicker_displayAttachmentGalleryEmptyValue($targetDocument, $targetAttachDocument, $options, $currentValue)
49 + #set ($sortedAttachments = $sorttool.sort($targetAttachDocument.getAttachmentList(), "${options.sortAttachmentsBy}") )
56 56   #foreach ($attachment in $sortedAttachments)
57 57   #set ($extension = $attachment.getFilename())
58 58   #set ($extension = $extension.substring($mathtool.add($extension.lastIndexOf('.'), 1)).toLowerCase())
... ... @@ -72,46 +72,18 @@
72 72   * @param $currentValue the currently selected file, used for determining if the box should be highlighted as the current value
73 73   *#
74 74  #macro (attachmentPicker_displayAttachmentBox $attachment $targetDocument $targetAttachDocument, $options $currentValue)
75 - #set ($hasTemporaryAttachment = "$!services.temporaryAttachments" != '')
76 - #set ($canEdit = $xwiki.hasAccessLevel('edit', $xcontext.user, ${targetAttachDocument.fullName}))
77 - #set ($isTemporaryAttachment = false)
78 - #if(!$hasTemporaryAttachment)
79 - #set ($canDeleteAttachment = $canEdit)
69 + #if ($options.displayImage && $attachment.isImage())
70 + #set ($cssClass = 'gallery_image')
80 80   #else
81 - #set ($isTemporaryAttachment = $services.temporaryAttachments.temporaryAttachmentExists($attachment))
82 - ## TODO: Update once it is made possible to delete temporary attachments (see XWIKI-20225).
83 - #set ($canDeleteAttachment = !$isTemporaryAttachment && $canEdit)
72 + #set ($cssClass = '')
84 84   #end
85 - #set ($cssClasses = [])
86 - #if ($options.displayImage && $attachment.isImage())
87 - #set ($discard = $cssClasses.add('gallery_image'))
88 - #end
89 - #if ($isTemporaryAttachment)
90 - #set ($discard = $cssClasses.add('temporary_attachment'))
91 - #end
92 - #attachmentPicker_displayStartFrame({'value' : $attachment.filename, 'text' : $attachment.filename, 'cssClass' : "${stringtool.join($cssClasses, ' ')}"} $currentValue)
74 + #attachmentPicker_displayStartFrame({'value' : $attachment.filename, 'text' : $attachment.filename, 'cssClass' : "$!{cssClass}"} $currentValue)
93 93   #attachmentPicker_displayAttachmentDetails($attachment $options)
94 94   #set ($returnURL = $escapetool.url($doc.getURL('view', $request.queryString)))
95 95   #set ($deleteURL = $targetAttachDocument.getAttachmentURL($attachment.filename, 'delattachment', "xredirect=${returnURL}&form_token=$!{services.csrf.getToken()}") )
96 96   #set ($viewURL = $targetAttachDocument.getAttachmentURL($attachment.filename) )##{'name' : 'download', 'url' : $viewURL, 'rel' : '__blank'}
97 - #set ($selectURL = $targetDocument.getURL(${options.get('docAction')}, $escapetool.url({
98 - "${options.get('classname')}_${options.get('object')}_${options.get('property')}": ${attachment.filename},
99 - 'form_token': $!{services.csrf.getToken()}
100 - })))
101 - ## Delete action is only proposed for users with the edit right on the document.
102 - ## If the temporary attachment is available, the delete action is only allowed for non-temporary attachments.
103 - #set ($attachmentActions = [{'name' : 'select', 'url' : $selectURL}])
104 - #if($canDeleteAttachment)
105 - #set ($discard = $attachmentActions.add({'name' : 'delete', 'url' : $deleteURL}))
106 - #end
107 - #define($additionalContent)
108 - #if ($isTemporaryAttachment)
109 - #set ($titleMessage = $services.localization.render('attachment.attachmentSelector.attachmentBox.temporaryAttachmentTitle'))
110 - #set ($titleMessage = $services.rendering.escape($titleMessage, 'xwiki/2.1'))
111 - (% title="$titleMessage" %)$services.icon.render('clock')(%%)
112 - #end
113 - #end
114 - #attachmentPicker_displayEndFrame ($attachmentActions $additionalContent)
79 + #set ($selectURL = $targetDocument.getURL(${options.get('docAction')}, "${options.get('classname')}_${options.get('object')}_${options.get('property')}=${attachment.filename}&form_token=$!{services.csrf.getToken()}"))
80 + #attachmentPicker_displayEndFrame ([{'name' : 'select', 'url' : $selectURL}, {'name' : 'delete', 'url' : $deleteURL}])
115 115  #end
116 116  
117 117  #**
... ... @@ -123,9 +123,7 @@
123 123   *#
124 124  #macro (attachmentPicker_displayStartFrame $boxOptions $currentValue)
125 125   (% class="gallery_attachmentbox $!{boxOptions.cssClass} #if ("$!{boxOptions.value}" == $currentValue) current#{end}" %)(((
126 - (% class="gallery_attachmenttitle" title="$services.rendering.escape($!{boxOptions.value}, 'xwiki/2.1')" %)(((
127 - $services.rendering.escape($boxOptions.text, 'xwiki/2.1')
128 - )))
92 + (% class="gallery_attachmenttitle" title="$!{boxOptions.value}" %)((($boxOptions.text)))
129 129   (% class="gallery_attachmentframe" %)(((
130 130  #end
131 131  
... ... @@ -138,19 +138,14 @@
138 138   *#
139 139  #macro (attachmentPicker_displayAttachmentDetails $attachment $options)
140 140   #if ($attachment)
141 - ## Compute the attachment reference because there's no getter.
142 - #set ($attachmentReference = $services.model.createAttachmentReference($attachment.document.documentReference,
143 - $attachment.filename))
144 - #set ($attachmentStringReference = $services.rendering.escape($services.model.serialize($attachmentReference, 'default'), 'xwiki/2.1'))
145 145   #if ($attachment.isImage() && $options.displayImage)
146 - ## We add the version to the query string in order to invalidate the cache when an image attachment is replaced.
147 - #set ($queryString = $escapetool.url({'version': $attachment.version}))
148 - [[[[image:${attachmentStringReference}||width=180 queryString="$queryString"]]>>attach:$attachmentStringReference]]
106 + #set ($attachmentDocument = $attachment.getDocument())
107 +[[[[image:${attachmentDocument.fullName}@${attachment.filename}||width=180]]>>attach:${attachmentDocument.fullName}@${attachment.filename}||rel="lightbox[attachments]"]]
149 149   #else
150 - * (% class="mime" %){{html wiki=false clean=false}}#mimetypeimg($attachment.getMimeType().toLowerCase() $attachment.getFilename().toLowerCase()){{/html}}(%%) (% class="filename" %)$services.rendering.escape($attachment.getFilename(), 'xwiki/2.1')(% %)
151 - * v$attachment.getVersion() (#dynamicsize($attachment.longSize))
109 + * (% class="mime" %){{html wiki=false clean=false}}#mimetypeimg($attachment.getMimeType().toLowerCase() $attachment.getFilename().toLowerCase()){{/html}}(%%) (% class="filename" %)$attachment.getFilename()(% %)
110 + * v$attachment.getVersion() (#dynamicsize($attachment.filesize))
152 152   * $services.localization.render('core.viewers.attachments.author', [$!{xwiki.getUserName($attachment.author, false)}]) $services.localization.render('core.viewers.attachments.date', [$!{xwiki.formatDate($attachment.date, 'dd/MM/yyyy hh:mm')}])
153 - * (% class="buttonwrapper" %)[[${services.localization.render("${translationPrefix}.actions.download")}>>attach:${attachmentStringReference}||title="$services.localization.render("${translationPrefix}.actions.download")" rel="__blank" class="button"]](%%)
112 + * (% class="buttonwrapper" %)[[${services.localization.render("${translationPrefix}.actions.download")}>>attach:${attachment.getDocument()}@${attachment.filename}||title="$services.localization.render("${translationPrefix}.actions.download")" rel="__blank" class="button"]](%%)
154 154   #end
155 155   #end
156 156  #end
... ... @@ -167,9 +167,8 @@
167 167   * <dt>rel</dt>
168 168   * <dd>an optional parameter to be used in the "rel" HTML attribute; for example "__blank" can be used to open the link in a new tab/window</dd>
169 169   * </dl>
170 - * @param $additionalContent optional additional content that does not follow the structure of the actions
171 171   *#
172 -#macro (attachmentPicker_displayEndFrame $actions $additionalContent)
130 +#macro (attachmentPicker_displayEndFrame $actions)
173 173   )))## attachmentframe
174 174   (% class="gallery_actions" %)(((
175 175   #foreach ($action in $actions)
... ... @@ -176,7 +176,6 @@
176 176   #set( $actionname = $services.localization.render("${translationPrefix}.actions.${action.name}") )
177 177   [[${actionname}>>path:${action.url}||class="tool ${action.name}" title="${actionname}" #if($action.rel) rel="${action.rel}"#end]]##
178 178   #end
179 - $!additionalContent
180 180   )))## actions
181 181   )))## attachmentbox
182 182  #end
... ... @@ -200,7 +200,7 @@
200 200   #if (${options.rawfilter} != '')
201 201   <span class="xHint">$escapetool.xml($services.localization.render("${translationPrefix}.upload.hint", [${options.rawfilter}]))</span>
202 202   #end
203 - <input type="file" name="filepath" id="attachfile" class="noitems" title="$!{escapetool.xml($options.rawfilter)}"/>
160 + <input type="file" name="filepath" id="attachfile" class="attachment" size="30" title="$!{escapetool.xml($options.rawfilter)}"/>
204 204   <input type="hidden" name="xredirect" value="$xwiki.getDocument($attachmentPickerDocName).getURL('get', "xaction=postUpload&amp;docAction=$!{escapetool.url($options.get('docAction'))}&amp;targetdocname=$!{escapetool.url($targetAttachDocument.fullName)}&amp;docname=$!{escapetool.url($targetDocument.fullName)}&amp;fieldname=$!{escapetool.url($options.get('classname'))}_$!{escapetool.url($options.get('object'))}_$!{escapetool.url($options.get('property'))}&amp;form_token=$!{services.csrf.getToken()}")" />
205 205   <input type="hidden" name="docname" value="$!{escapetool.xml($targetDocument.fullName)}" />
206 206   <input type="hidden" name="classname" value="$!{escapetool.xml($options.get('classname'))}" />
... ... @@ -208,27 +208,6 @@
208 208   <input type="hidden" name="property" value="$!{escapetool.xml($options.get('property'))}" />
209 209   <input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" />
210 210   </div>
211 - #if ("$!currentValue" != '' && $currentValue != $options.defaultValue)
212 - <div>
213 - <label>
214 - <input type="checkbox" name="filename" value="$!escapetool.xml($currentValue)"
215 - />$services.localization.render('attachmentSelector.replace',
216 - ["<strong>$!escapetool.xml($currentValue)</strong>"])
217 - </label>
218 - <span class="xHint">$escapetool.xml($services.localization.render('attachmentSelector.replace.hint'))</span>
219 - </div>
220 - #end
221 - #if ($xwiki.hasEditComment() && $options.versionSummary)
222 - <div>
223 - #if ($xwiki.isEditCommentFieldHidden())
224 - <input type="hidden" name="comment" value="$!escapetool.xml($request.comment)" />
225 - #else
226 - <label for="commentinput">$services.localization.render('core.comment')</label>
227 - <input type="text" name="comment" id="commentinput" value="$!escapetool.xml($request.comment)"
228 - title="$services.localization.render('core.comment.tooltip')" />
229 - #end
230 - </div>
231 - #end
232 232   <div class="buttons">
233 233   <span class="buttonwrapper">
234 234   <input type="submit" name="action_upload" class="button " value='$services.localization.render("${translationPrefix}.upload.submit")' title='$services.localization.render("${translationPrefix}.upload.submit")'/>
... ... @@ -272,6 +272,11 @@
272 272  
273 273  {{velocity}}
274 274  #if ($request.docname)
211 + ###if ($request.xpage == 'plain')
212 + ## ## IE6 + XHR + gzip compression = BOOM!
213 + ## ## This disables the automatic gzip compression
214 + ## $response.setContentType('multipart/formdata')
215 + ###end
275 275   #set ($targetDocument = $xwiki.getDocument($request.docname))
276 276   #if ($request.targetdocname)
277 277   ## Use the target document if it exists.
... ... @@ -320,7 +320,7 @@
320 320   #end
321 321   #set ($options = {
322 322   'classname' : ${request.get('classname')},
323 - 'object' : $!{numbertool.toNumber($request.object).intValue()},
264 + 'object' : $!{mathtool.toInteger($request.object)},
324 324   'property' : ${request.property},
325 325   'displayImage' : ${displayImage},
326 326   'docAction' : ${docAction},
... ... @@ -327,16 +327,13 @@
327 327   'defaultValue' : "$!{request.defaultValue}",
328 328   'rawfilter': "$!{rawfilter}",
329 329   'filter': ${filter},
330 - 'sortAttachmentsBy': ${sortAttachmentsBy},
331 - 'versionSummary': $request.versionSummary.equals('true')
271 + 'sortAttachmentsBy': ${sortAttachmentsBy}
332 332   })
333 333   $!targetDocument.use($targetDocument.getObject($options.classname, $options.object))##
334 334   #attachmentPicker_displayAttachmentGallery($targetDocument, $targetAttachDocument, $options)
335 335  
336 - #set ($cancelLinkName = $services.rendering.escape($services.rendering.escape($services.localization.render("${translationPrefix}.cancel"), 'xwiki/2.1'), 'xwiki/2.1'))
337 - #set ($cancelLinkTarget = $services.rendering.escape($services.model.serialize($targetDocument), 'xwiki/2.1'))
338 338   (% class="gallery_buttons buttons" %)(((
339 - (% class="buttonwrapper secondary" %)[[$cancelLinkName>>$cancelLinkTarget||class="button secondary" id="attachment-picker-close"]]
277 + (% class="buttonwrapper secondary" %)[[$services.localization.render("${translationPrefix}.cancel")>>$targetDocument||class="button secondary" id="attachment-picker-close"]]
340 340   )))
341 341  #end
342 342  {{/velocity}}
XWiki.JavaScriptExtension[0]
Code
... ... @@ -1,66 +1,4 @@
1 1  var XWiki = (function(XWiki) {
2 - function uploadTemporaryAttachment() {
3 - // Require jquery locally until we are able to fully migrate this code away from prototype.
4 - const form = this.property.up('form');
5 - require(['jquery'], function ($) {
6 - const data = new FormData();
7 - const uploadedFile = $('#attachfile')[0].files[0];
8 - const filenameCheckbox = $("#uploadAttachment input[name='filename']");
9 -
10 - // TODO: Fix replace currently selected checkbox (see XWIKI-20181).
11 - data.append('upload', uploadedFile);
12 - const notification = new XWiki.widgets.Notification(
13 - "$services.localization.render('xe.attachmentSelector.upload.inProgress')", 'inprogress');
14 - const params = {
15 - 'form_token': $(form).find('[name="form_token"]').val(),
16 - 'sheet': 'CKEditor.FileUploader',
17 - 'outputSyntax': 'plain'
18 - };
19 -
20 - // Update the name of the file with the name of the currently selected attachment if required.
21 - if (filenameCheckbox.prop('checked')) {
22 - params['filename'] = filenameCheckbox.val()
23 - }
24 -
25 - $.ajax({
26 - 'url': XWiki.currentDocument.getURL('get', new URLSearchParams(params).toString()),
27 - method: 'POST',
28 - data: data,
29 - processData: false,
30 - contentType: false, // Sets the 'multipart/form-data' automatically
31 - headers: {
32 - 'X-XWiki-Temporary-Attachment-Support': true
33 - }
34 - }).done(function (response) {
35 - #set ($successMessage = $escapetool.javascript($services.localization.render('attachment.attachmentSelector.temporaryUpload.success')))
36 - notification.replace(new XWiki.widgets.Notification("$successMessage", 'done'));
37 - // Add a field with the name of the uploaded file so that it is moved from the temporary
38 - // attachments to the persisded ones on save.
39 - $(form).append($('<input/>')
40 - .prop('type', 'hidden')
41 - .prop('name', 'uploadedFiles')
42 - .prop('value', response.fileName))
43 - $(form).find('input[type="hidden"].property-reference').prop('value', response.fileName);
44 - this.updateAttachment(response.fileName, response.url);
45 - this.dialog.closeDialog();
46 - }.bind(this)).fail(function () {
47 - #set ($errorMessage = $escapetool.javascript($services.localization.render('attachment.attachmentSelector.temporaryUpload.failure')))notification.replace(new XWiki.widgets.Notification("$errorMessage", 'error'));
48 - });
49 - }.bind(this));
50 - }
51 -
52 - function directUploadAttachment(uploadForm) {
53 - // FIXME This fails in HTML5, will deal with it later:
54 - // this.property.down('input').value = uploadForm.down('input[type="file"]').value;
55 - // uploadForm.xredirect.value = window.location.pathname;
56 - document.observe('xwiki:document:saved', function () {
57 - new XWiki.widgets.Notification("$services.localization.render('xe.attachmentSelector.upload.inProgress')",
58 - 'inprogress');
59 - uploadForm.submit();
60 - })
61 - document.fire('xwiki:actions:save', {'continue': true, form: this.property.up('form')});
62 - }
63 -
64 64   /** Handles the gallery buttons directly in the current page without reloading the window. */
65 65   XWiki.AttachmentPicker = Class.create({
66 66   /**
... ... @@ -102,7 +102,7 @@
102 102   * and saves the underlying form (if any) so that any unsaved changes won't be lost.
103 103   */
104 104   filterFormUpload : function() {
105 - this.gallery.select('.uploadAttachment input[type="file"]').each(function(fileInput) {
43 + this.gallery.select('.uploadAttachment input.attachment').each(function(fileInput) {
106 106   fileInput.__allowedExtensions = fileInput.title.toLowerCase().replace(/\s*[,|; ]\s*/g, " ").strip();
107 107   if (fileInput.__allowedExtensions != '') {
108 108   fileInput.__allowedExtensions = fileInput.__allowedExtensions.split(" ");
... ... @@ -114,7 +114,7 @@
114 114   event.stop();
115 115   var uploadForm = event.element();
116 116   var hasErrors = false;
117 - uploadForm.select('input[type="file"]').each(function(fileInput) {
55 + uploadForm.select('input.attachment').each(function(fileInput) {
118 118   if (fileInput.value == '') {
119 119   new XWiki.widgets.Notification("$services.localization.render('xe.attachmentSelector.upload.error.noFile')", 'error');
120 120   hasErrors = true;
... ... @@ -122,23 +122,21 @@
122 122   new XWiki.widgets.Notification("$services.localization.render('xe.attachmentSelector.upload.error.badExtension')", 'error');
123 123   hasErrors = true;
124 124   }
125 - const beforeUploadEvent = Event.fire(document, 'xwiki:actions:beforeUpload', {
126 - file: fileInput.files[0]
127 - });
128 -
129 - if (beforeUploadEvent.defaultPrevented) {
130 - hasErrors = true;
131 - }
132 132   }.bind(this));
64 + // No form submission by AJAX right now, because file uploads can't be done this way without HTML5, this is future work
65 + // Save the document before submitting, since the current form data will be lost otherwise
133 133   if (!hasErrors) {
134 134   if (this.directSave) {
135 135   uploadForm.submit();
136 136   } else {
137 - if ("$!services.temporaryAttachments" != '') {
138 - uploadTemporaryAttachment.call(this);
139 - } else {
140 - directUploadAttachment.call(this, uploadForm);
141 - }
70 + // FIXME This fails in HTML5, will deal with it later:
71 + // this.property.down('input').value = uploadForm.down('.attachment').value;
72 + // uploadForm.xredirect.value = window.location.pathname;
73 + document.observe('xwiki:document:saved', function() {
74 + new XWiki.widgets.Notification("$services.localization.render('xe.attachmentSelector.upload.inProgress')", 'inprogress');
75 + uploadForm.submit();
76 + })
77 + document.fire('xwiki:actions:save', {'continue': true, form: this.property.up('form')});
142 142   }
143 143   }
144 144   }.bindAsEventListener(this));
... ... @@ -181,11 +181,6 @@
181 181   if (this.gallery.down('.gallery_emptyChoice')) {
182 182   this.gallery.down('.gallery_emptyChoice').addClassName('current');
183 183   }
184 - // Disable the replace feature because there's no selection.
185 - var fileNameInput = this.gallery.down('input[type="checkbox"][name="filename"]');
186 - fileNameInput.disabled = true;
187 - // Empty the displayed selected file name.
188 - fileNameInput.up('label').down('strong').update('');
189 189   if (!this.directSave) {
190 190   this.property.down('input').value = this.defaultValue;
191 191   }
... ... @@ -237,7 +237,10 @@
237 237   this.dialog.closeDialog();
238 238   }.bindAsEventListener(this),
239 239   onFailure : function(response) {
240 - var failureReason = response.statusText || 'Server not responding';
171 + var failureReason = response.statusText;
172 + if (response.statusText == '' /* No response */ || response.status == 12031 /* In IE */) {
173 + failureReason = 'Server not responding';
174 + }
241 241   if (targetElement._x_notif) {
242 242   targetElement._x_notif.replace(new XWiki.widgets.Notification("$services.localization.render('core.widgets.confirmationBox.notification.failed')" + failureReason, "error"));
243 243   } else {
... ... @@ -244,6 +244,9 @@
244 244   new XWiki.widgets.Notification(this.interactionParameters.failureMessageText + failureReason, "error");
245 245   }
246 246   },
181 + on1223 : function(response) {
182 + response.request.options.onSuccess(response);
183 + },
247 247   on0 : function(response) {
248 248   response.request.options.onFailure(response);
249 249   },
... ... @@ -333,7 +333,11 @@
333 333   );
334 334   dialog.shortcuts.close.keys = [];
335 335   dialog.showDialog();
336 - dialog.dialog.down().setStyle({position: "fixed"});
273 + if (window.browser.isIE6x) {
274 + dialog.dialog.down().setStyle({position: "absolute"});
275 + } else {
276 + dialog.dialog.down().setStyle({position: "fixed"});
277 + }
337 337   dialog.dialog.setStyle({top: document.viewport.getScrollOffsets().top + "px", position: "absolute"});
338 338   dialog.dialogBox.setStyle({overflow: "hidden", width: "80%", margin: "0 10%"});
339 339   new Ajax.Updater(loading.up(), url, {
XWiki.StyleSheetExtension[0]
Code
... ... @@ -27,7 +27,7 @@
27 27  .gallery_attachmentbox {
28 28   background: $theme.pageContentBackgroundColor;
29 29   border: 1px solid $theme.borderColor;
30 - border-radius: 8px;
30 + border-radius: 5px;
31 31   float: left;
32 32   margin: ${boxMargin}px;
33 33   overflow: hidden;
... ... @@ -34,11 +34,19 @@
34 34   position: relative;
35 35   width: ${boxSize}px;
36 36  }
37 +/* Broken IE6 box model, add the border width to the total width. */
38 +* html .gallery_attachmentbox {
39 + width: ${mathtool.add($boxSize, 2)}px;
40 +}
37 37  .gallery .current {
38 38   background-color: $theme.highlightColor;
39 39   border-width: 3px;
40 40   margin: 3px;
41 41  }
46 +/* Broken IE6 box model, add the border width to the total width. */
47 +* html .gallery .current {
48 + width: ${mathtool.add($boxSize, 6)}px;
49 +}
42 42  .gallery .current .gallery_attachmenttitle {
43 43   font-weight: bold;
44 44  }
... ... @@ -49,7 +49,7 @@
49 49  .gallery_attachmenttitle {
50 50   background: $theme.backgroundSecondaryColor;
51 51   border-bottom: 1px dotted $theme.borderColor;
52 - border-radius: 8px 8px 0px 0px;
60 + border-radius: 5px 5px 0px 0px;
53 53   font-size: 85%;
54 54   padding: 3px ${boxPadding}px;
55 55   overflow: hidden;
... ... @@ -140,6 +140,9 @@
140 140   ## Make this box twice as large as the others
141 141   width: ${uploadBoxSize}px;
142 142  }
151 +* html .gallery_upload {
152 + width: ${mathtool.add($uploadBoxSize, 2)}px;
153 +}
143 143  .gallery_upload, .gallery_upload:hover {
144 144   background-color: $theme.backgroundSecondaryColor;
145 145  }
... ... @@ -150,29 +150,24 @@
150 150   background-repeat: no-repeat;
151 151   padding-left: 16px;
152 152  }
153 -.gallery_upload .gallery_attachmentframe {
154 - height: auto;
164 +.gallery_upload form {
165 + height: ${imgSize}px;
155 155  }
156 -.gallery_upload_input {
157 - margin-bottom: 10px;
167 +.gallery_upload .xHint {
168 + text-transform: none !important;
158 158  }
159 -.gallery_upload input[type="file"] {
160 - font-size: 86%;
170 +.gallery_upload input.attachment {
171 + font-size: 83.3%;
172 + margin: 0; /* Overrides viewers/attachments.css */
173 + padding: 0; /* Overrides viewers/attachments.css */
161 161   width: ${mathtool.sub($uploadBoxSize, $mathtool.mul($boxPadding, 2))}px;
162 162  }
163 163  .gallery_upload .buttonwrapper {
164 164   margin: 0;
165 165  }
166 -.gallery_upload .button,
167 -.gallery_upload label {
168 - font-size: 86%;
179 +.gallery_upload .button {
180 + font-size: .65em;
169 169  }
170 -.gallery_upload input[type="checkbox"] {
171 - vertical-align: text-bottom;
172 -}
173 -.gallery_upload label[for="commentinput"] {
174 - margin-top: 10px;
175 -}
176 176  
177 177  /* ------------------------------------ */
178 178  /* Buttons on top: */
XWiki.WikiMacroClass[0]
Macro code
... ... @@ -3,6 +3,7 @@
3 3  $xwiki.ssfx.use('js/xwiki/widgets/modalPopup.css', true)##
4 4  $xwiki.jsx.use($xcontext.macro.doc.fullName)##
5 5  $xwiki.ssx.use($xcontext.macro.doc.fullName)##
6 +$xwiki.jsfx.use('js/scriptaculous/builder.js')##
6 6  ## Integrates the optional Lightbox widget (from http://extensions.xwiki.org/xwiki/bin/view/Extension/Lightbox+Application )
7 7  #if ($xwiki.exists('XWiki.Lightbox'))
8 8   $xwiki.jsx.use('XWiki.Lightbox')
... ... @@ -31,9 +31,9 @@
31 31  #end
32 32  #set ($classname = "$!{xcontext.macro.params.classname}")
33 33  #set ($property = "$!{xcontext.macro.params.property}")
34 -#set ($object = $numbertool.toNumber("$!{xcontext.macro.params.object}").intValue())
35 +#set ($object = $mathtool.toInteger("$!{xcontext.macro.params.object}"))
35 35  #if ("$!{object}" != $!{xcontext.macro.params.object})
36 - #set ($object = ${targetdoc.getObject($classname).number})
37 + #set ($object = ${doc.getObject($classname).number})
37 37   #if ("$!{object}" == '')
38 38   #set ($object = 0)
39 39   #end
... ... @@ -45,18 +45,9 @@
45 45   #set ($displayImage = false)
46 46  #end
47 47  #if ($displayImage)
48 - #set ($alt = '')
49 - #set ($width = '')
50 - #set ($height = '')
51 - #if ($xcontext.macro.params.alternateText)
52 - #set ($alt = "$services.rendering.escape($!{xcontext.macro.params.alternateText}, 'xwiki/2.1')")
53 - #end
54 - #if ($xcontext.macro.params.width)
55 - #set ($width = "$services.rendering.escape($!{xcontext.macro.params.width}, 'xwiki/2.1')")
56 - #end
57 - #if ($xcontext.macro.params.height)
58 - #set ($height = "$services.rendering.escape($!{xcontext.macro.params.height}, 'xwiki/2.1')")
59 - #end
49 + #set ($alt = "$!{xcontext.macro.params.alternateText}")
50 + #set ($width = "$!{xcontext.macro.params.width}")
51 + #set ($height = "$!{xcontext.macro.params.height}")
60 60   #set ($imageParams = '')
61 61   #if ("${width}" != '')
62 62   #set($imageParams = "$!{imageParams} width=${width}")
... ... @@ -94,7 +94,7 @@
94 94   #set ($savemode = 'form')
95 95  #end
96 96  
97 -#set ($propValue = "$!{targetdoc.getObject($classname, $object).getProperty($property).value}")
89 +#set ($propValue = "$!{doc.getObject($classname, $object).getProperty($property).value}")
98 98  ##
99 99  
100 100  #macro (attachmentPicker_displayAttachment $name $displayImage $withLink $forceElement)
... ... @@ -121,9 +121,9 @@
121 121   #set ($attachmentResource = '')
122 122   #end
123 123   #if ($displayImage)
124 - (% class="$!{cssClass}#if (!$attachment) hidden#end" %)(((#if ("$!{attachmentResource}" != '' || $forceElement)#if($withLink)[[#end[[image:$services.rendering.escape(${attachmentResource}, 'xwiki/2.1')$!{imageParams}]]#if($withLink)>>attach:$services.rendering.escape(${attachmentResource},'xwiki/2.1')||rel=lightbox]]#{end}#end)))##
116 + (% class="$!{cssClass}#if (!$attachment) hidden#end" %)(((#if ("$!{attachmentResource}" != '' || $forceElement)#if($withLink)[[#end[[image:${attachmentResource}$!{imageParams}]]#if($withLink)>>attach:${attachmentResource}||rel=lightbox]]#{end}#end)))##
125 125   #else
126 - (% class="$!{cssClass}" %)#if ("$!{attachmentResource}" != '' || $forceElement)#if ($withLink)[[attach:${attachmentResource}||rel=__blank]]#{else}(% class="displayed" %)#if($targetPermView)$!{services.rendering.escape($!{attachmentName}, 'xwiki/2.1')}#{else}Access Denied#{end}(% %)#{end}#end(%%)##
118 + (% class="$!{cssClass}" %)#if ("$!{attachmentResource}" != '' || $forceElement)#if ($withLink)[[attach:${attachmentResource}||rel=__blank]]#{else}(% class="displayed" %)#if($targetPermView)$!{attachmentName}#{else}Access Denied#{end}(% %)#{end}#end(%%)##
127 127   #end
128 128  #end
129 129  
... ... @@ -131,25 +131,7 @@
131 131  ## 1. Edit the current page
132 132  ## 2. View the target attachment page. (can be the same page)
133 133  #macro (attachmentPicker_displayButton)
134 - #if ($targetPermView)
135 - #set ($queryString = {
136 - 'docname': $doc.fullName,
137 - 'classname': $classname,
138 - 'property': $property,
139 - 'object': $object,
140 - 'savemode': $savemode,
141 - 'defaultValue': $defaultValue,
142 - 'filter': $filter,
143 - 'displayImage': $displayImage,
144 - 'versionSummary': $xcontext.macro.params.versionSummary.equals('true')
145 - })
146 - #if ($hasTargetDoc)
147 - #set ($queryString.targetdocname = $targetdoc.fullName)
148 - #end
149 - #set ($linkLabel = $services.rendering.escape($services.rendering.escape($buttontext, 'xwiki/2.1'), 'xwiki/2.1'))
150 - (% class="buttonwrapper" %)[[$linkLabel>>${xcontext.macro.doc.fullName}||queryString="$escapetool.url($queryString)"
151 - class="attachment-picker-start button" title="$services.rendering.escape($buttontext, 'xwiki/2.1')"]](%%)##
152 - #end
126 + #if ($hasEdit && $targetPermView)(% class="buttonwrapper" %)[[${buttontext}>>${xcontext.macro.doc.fullName}||queryString="#if ($hasTargetDoc)targetdocname=${escapetool.url($targetdoc.fullName)}&#{end}docname=${escapetool.url($doc.fullName)}&classname=${classname}&property=${property}&object=${object}&savemode=${savemode}&defaultValue=$escapetool.url($defaultValue)&filter=$!{filter}&displayImage=${displayImage}" class="attachment-picker-start button" title="${buttontext}"]](%%)#end
153 153  #end
154 154  {{/velocity}}
155 155  
... ... @@ -159,7 +159,7 @@
159 159  #elseif ($xcontext.action == 'inline' || $xcontext.action == 'edit')
160 160   (% class="attachment-picker" %)(((##
161 161   #attachmentPicker_displayAttachment($propValue $displayImage false true) #attachmentPicker_displayButton()##
162 - {{html}}<input type="hidden" name="$escapetool.xml("${classname}_${object}_${property}")" value="$escapetool.xml("${propValue}")" class="property-reference"/>{{/html}}##
136 + {{html}}<input type="hidden" name="${classname}_${object}_${property}" value="${propValue}"/>{{/html}}##
163 163   )))
164 164  #else
165 165   #attachmentPicker_displayAttachment($propValue $displayImage $link false)
Cached
... ... @@ -1,1 +1,0 @@
1 -No
Asynchronous rendering
... ... @@ -1,1 +1,0 @@
1 -No
Default categories
... ... @@ -1,1 +1,0 @@
1 -Development
XWiki.WikiMacroParameterClass[0]
Parameter type
... ... @@ -1,1 +1,0 @@
1 -org.xwiki.model.reference.DocumentReference
XWiki.WikiMacroParameterClass[10]
Parameter type
... ... @@ -1,1 +1,0 @@
1 -org.xwiki.model.reference.AttachmentReference
XWiki.WikiMacroParameterClass[18]
Parameter type
... ... @@ -1,1 +1,0 @@
1 -org.xwiki.model.reference.DocumentReference
XWiki.WikiMacroParameterClass[19]
Parameter default value
... ... @@ -1,1 +1,0 @@
1 -false
Parameter name
... ... @@ -1,1 +1,0 @@
1 -versionSummary
Parameter description
... ... @@ -1,1 +1,0 @@
1 -Whether to allow the user to enter a version summary that will be recorded in the history. An automatic message is used when no version summary is provided or if the version summary input is not displayed.
Parameter mandatory
... ... @@ -1,1 +1,0 @@
1 -No