| ... |
... |
@@ -45,11 +45,14 @@ |
| 45 |
45 |
#end |
| 46 |
46 |
(% class="gallery" %)((( |
| 47 |
47 |
## Only display the upload form if they have edit permission on targetAttachDocument |
| 48 |
|
- #if ($xwiki.hasAccessLevel('edit',$xcontext.user,${targetAttachDocument.fullName})) |
| 49 |
|
- #attachmentPicker_displayUploadForm($targetDocument, $targetAttachDocument, $options) |
| 50 |
|
- #end |
|
48 |
+ #attachmentPicker_displayUploadForm($targetDocument, $targetAttachDocument, $options) |
| 51 |
51 |
#attachmentPicker_displayAttachmentGalleryEmptyValue($targetDocument, $targetAttachDocument, $options, $currentValue) |
| 52 |
|
- #set ($sortedAttachments = $collectiontool.sort($targetAttachDocument.getAttachmentList(), "${options.sortAttachmentsBy}") ) |
|
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}") ) |
|
55 |
+ #end |
| 53 |
53 |
#foreach ($attachment in $sortedAttachments) |
| 54 |
54 |
#set ($extension = $attachment.getFilename()) |
| 55 |
55 |
#set ($extension = $extension.substring($mathtool.add($extension.lastIndexOf('.'), 1)).toLowerCase()) |
| ... |
... |
@@ -69,18 +69,46 @@ |
| 69 |
69 |
* @param $currentValue the currently selected file, used for determining if the box should be highlighted as the current value |
| 70 |
70 |
*# |
| 71 |
71 |
#macro (attachmentPicker_displayAttachmentBox $attachment $targetDocument $targetAttachDocument, $options $currentValue) |
| 72 |
|
- #if ($options.displayImage && $attachment.isImage()) |
| 73 |
|
- #set ($cssClass = 'gallery_image') |
|
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) |
| 74 |
74 |
#else |
| 75 |
|
- #set ($cssClass = '') |
|
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) |
| 76 |
76 |
#end |
| 77 |
|
- #attachmentPicker_displayStartFrame({'value' : $attachment.filename, 'text' : $attachment.filename, 'cssClass' : "$!{cssClass}"} $currentValue) |
|
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) |
| 78 |
78 |
#attachmentPicker_displayAttachmentDetails($attachment $options) |
| 79 |
79 |
#set ($returnURL = $escapetool.url($doc.getURL('view', $request.queryString))) |
| 80 |
80 |
#set ($deleteURL = $targetAttachDocument.getAttachmentURL($attachment.filename, 'delattachment', "xredirect=${returnURL}&form_token=$!{services.csrf.getToken()}") ) |
| 81 |
81 |
#set ($viewURL = $targetAttachDocument.getAttachmentURL($attachment.filename) )##{'name' : 'download', 'url' : $viewURL, 'rel' : '__blank'} |
| 82 |
|
- #set ($selectURL = $targetDocument.getURL(${options.get('docAction')}, "${options.get('classname')}_${options.get('object')}_${options.get('property')}=${attachment.filename}&form_token=$!{services.csrf.getToken()}")) |
| 83 |
|
- #attachmentPicker_displayEndFrame ([{'name' : 'select', 'url' : $selectURL}, {'name' : 'delete', 'url' : $deleteURL}]) |
|
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) |
| 84 |
84 |
#end |
| 85 |
85 |
|
| 86 |
86 |
#** |
| ... |
... |
@@ -92,7 +92,9 @@ |
| 92 |
92 |
*# |
| 93 |
93 |
#macro (attachmentPicker_displayStartFrame $boxOptions $currentValue) |
| 94 |
94 |
(% class="gallery_attachmentbox $!{boxOptions.cssClass} #if ("$!{boxOptions.value}" == $currentValue) current#{end}" %)((( |
| 95 |
|
- (% class="gallery_attachmenttitle" title="$!{boxOptions.value}" %)((($boxOptions.text))) |
|
126 |
+ (% class="gallery_attachmenttitle" title="$services.rendering.escape($!{boxOptions.value}, 'xwiki/2.1')" %)((( |
|
127 |
+ $services.rendering.escape($boxOptions.text, 'xwiki/2.1') |
|
128 |
+ ))) |
| 96 |
96 |
(% class="gallery_attachmentframe" %)((( |
| 97 |
97 |
#end |
| 98 |
98 |
|
| ... |
... |
@@ -108,13 +108,13 @@ |
| 108 |
108 |
## Compute the attachment reference because there's no getter. |
| 109 |
109 |
#set ($attachmentReference = $services.model.createAttachmentReference($attachment.document.documentReference, |
| 110 |
110 |
$attachment.filename)) |
| 111 |
|
- #set ($attachmentStringReference = $services.model.serialize($attachmentReference, 'default')) |
|
144 |
+ #set ($attachmentStringReference = $services.rendering.escape($services.model.serialize($attachmentReference, 'default'), 'xwiki/2.1')) |
| 112 |
112 |
#if ($attachment.isImage() && $options.displayImage) |
| 113 |
113 |
## We add the version to the query string in order to invalidate the cache when an image attachment is replaced. |
| 114 |
114 |
#set ($queryString = $escapetool.url({'version': $attachment.version})) |
| 115 |
115 |
[[[[image:${attachmentStringReference}||width=180 queryString="$queryString"]]>>attach:$attachmentStringReference]] |
| 116 |
116 |
#else |
| 117 |
|
- * (% class="mime" %){{html wiki=false clean=false}}#mimetypeimg($attachment.getMimeType().toLowerCase() $attachment.getFilename().toLowerCase()){{/html}}(%%) (% class="filename" %)$attachment.getFilename()(% %) |
|
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')(% %) |
| 118 |
118 |
* v$attachment.getVersion() (#dynamicsize($attachment.longSize)) |
| 119 |
119 |
* $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')}]) |
| 120 |
120 |
* (% class="buttonwrapper" %)[[${services.localization.render("${translationPrefix}.actions.download")}>>attach:${attachmentStringReference}||title="$services.localization.render("${translationPrefix}.actions.download")" rel="__blank" class="button"]](%%) |
| ... |
... |
@@ -134,8 +134,9 @@ |
| 134 |
134 |
* <dt>rel</dt> |
| 135 |
135 |
* <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> |
| 136 |
136 |
* </dl> |
|
170 |
+ * @param $additionalContent optional additional content that does not follow the structure of the actions |
| 137 |
137 |
*# |
| 138 |
|
-#macro (attachmentPicker_displayEndFrame $actions) |
|
172 |
+#macro (attachmentPicker_displayEndFrame $actions $additionalContent) |
| 139 |
139 |
)))## attachmentframe |
| 140 |
140 |
(% class="gallery_actions" %)((( |
| 141 |
141 |
#foreach ($action in $actions) |
| ... |
... |
@@ -142,6 +142,7 @@ |
| 142 |
142 |
#set( $actionname = $services.localization.render("${translationPrefix}.actions.${action.name}") ) |
| 143 |
143 |
[[${actionname}>>path:${action.url}||class="tool ${action.name}" title="${actionname}" #if($action.rel) rel="${action.rel}"#end]]## |
| 144 |
144 |
#end |
|
179 |
+ $!additionalContent |
| 145 |
145 |
)))## actions |
| 146 |
146 |
)))## attachmentbox |
| 147 |
147 |
#end |
| ... |
... |
@@ -298,8 +298,10 @@ |
| 298 |
298 |
$!targetDocument.use($targetDocument.getObject($options.classname, $options.object))## |
| 299 |
299 |
#attachmentPicker_displayAttachmentGallery($targetDocument, $targetAttachDocument, $options) |
| 300 |
300 |
|
|
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')) |
| 301 |
301 |
(% class="gallery_buttons buttons" %)((( |
| 302 |
|
- (% class="buttonwrapper secondary" %)[[$services.localization.render("${translationPrefix}.cancel")>>${targetDocument}||class="button secondary" id="attachment-picker-close"]] |
|
339 |
+ (% class="buttonwrapper secondary" %)[[$cancelLinkName>>$cancelLinkTarget||class="button secondary" id="attachment-picker-close"]] |
| 303 |
303 |
))) |
| 304 |
304 |
#end |
| 305 |
305 |
{{/velocity}} |