Changes for page Attachments

Last modified by teamwire004 on 2026/01/13 09:09

From version 6.1
edited by teamwire004
on 2024/07/12 12:45
Change comment: Migrated property [type] from class [XWiki.WikiMacroParameterClass]
To version 13.1
edited by teamwire004
on 2026/01/13 09:09
Change comment: Install extension [org.xwiki.platform:xwiki-platform-attachment-ui/17.10.2]

Summary

Details

Page properties
Content
... ... @@ -10,7 +10,7 @@
10 10   #set ($docAction = $request.get('docAction'))
11 11   #set ($attachmentList = $targetAttachDocument.getAttachmentList())
12 12   #if ($attachmentList && $attachmentList.size() > 0)
13 - #set ($sortedAttachments = $sorttool.sort($attachmentList, 'date:desc'))
13 + #set ($sortedAttachments = $collectiontool.sort($attachmentList, 'date:desc'))
14 14   #set ($lastAttachment = $sortedAttachments.get(0))
15 15   #end
16 16   $response.sendRedirect($targetDocument.getURL($docAction, $escapetool.url({
... ... @@ -38,7 +38,7 @@
38 38   * @param $targetAttachDocument the document to list/save attachments to
39 39   * @param $options generic picker options
40 40   *#
41 -#macro (attachmentPicker_displayAttachmentGallery $targetDocument, $targetAttachDocument, $options)
41 +#macro (_attachmentPicker_displayAttachmentGallery $targetDocument, $targetAttachDocument, $options)
42 42   #set ($currentValue = $targetDocument.getValue($options.property))
43 43   #if ("$!{targetAttachDocument.getAttachment($currentValue)}" == '')
44 44   #set ($currentValue = "$!{options.defaultValue}")
... ... @@ -45,14 +45,19 @@
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 - #set ($sortedAttachments = $sorttool.sort($targetAttachDocument.getAttachmentList(), "${options.sortAttachmentsBy}") )
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}") )
55 + #end
51 51   #foreach ($attachment in $sortedAttachments)
52 52   #set ($extension = $attachment.getFilename())
53 53   #set ($extension = $extension.substring($mathtool.add($extension.lastIndexOf('.'), 1)).toLowerCase())
54 54   #if ($options.filter.size() == 0 || $options.filter.contains($extension))
55 - #attachmentPicker_displayAttachmentBox($attachment $targetDocument $targetAttachDocument, $options $currentValue)
60 + #_attachmentPicker_displayAttachmentBox($attachment $targetDocument $targetAttachDocument, $options $currentValue)
56 56   #end
57 57   #end
58 58   )))
... ... @@ -66,7 +66,7 @@
66 66   * @param $options generic picker options
67 67   * @param $currentValue the currently selected file, used for determining if the box should be highlighted as the current value
68 68   *#
69 -#macro (attachmentPicker_displayAttachmentBox $attachment $targetDocument $targetAttachDocument, $options $currentValue)
74 +#macro (_attachmentPicker_displayAttachmentBox $attachment $targetDocument $targetAttachDocument, $options $currentValue)
70 70   #set ($hasTemporaryAttachment = "$!services.temporaryAttachments" != '')
71 71   #set ($canEdit = $xwiki.hasAccessLevel('edit', $xcontext.user, ${targetAttachDocument.fullName}))
72 72   #set ($isTemporaryAttachment = false)
... ... @@ -84,8 +84,8 @@
84 84   #if ($isTemporaryAttachment)
85 85   #set ($discard = $cssClasses.add('temporary_attachment'))
86 86   #end
87 - #attachmentPicker_displayStartFrame({'value' : $attachment.filename, 'text' : $attachment.filename, 'cssClass' : "${stringtool.join($cssClasses, ' ')}"} $currentValue)
88 - #attachmentPicker_displayAttachmentDetails($attachment $options)
92 + #_attachmentPicker_displayStartFrame({'value' : $attachment.filename, 'text' : $attachment.filename, 'cssClass' : "${stringtool.join($cssClasses, ' ')}"} $currentValue)
93 + #_attachmentPicker_displayAttachmentDetails($attachment $options)
89 89   #set ($returnURL = $escapetool.url($doc.getURL('view', $request.queryString)))
90 90   #set ($deleteURL = $targetAttachDocument.getAttachmentURL($attachment.filename, 'delattachment', "xredirect=${returnURL}&form_token=$!{services.csrf.getToken()}") )
91 91   #set ($viewURL = $targetAttachDocument.getAttachmentURL($attachment.filename) )##{'name' : 'download', 'url' : $viewURL, 'rel' : '__blank'}
... ... @@ -95,9 +95,9 @@
95 95   })))
96 96   ## Delete action is only proposed for users with the edit right on the document.
97 97   ## If the temporary attachment is available, the delete action is only allowed for non-temporary attachments.
98 - #set ($attachmentActions = [{'name' : 'select', 'url' : $selectURL}])
103 + #set ($attachmentActions = [{'name' : 'select', 'url' : $selectURL, 'icon' : 'check', 'extraCssClass' : 'btn btn-xs btn-success'}])
99 99   #if($canDeleteAttachment)
100 - #set ($discard = $attachmentActions.add({'name' : 'delete', 'url' : $deleteURL}))
105 + #set ($discard = $attachmentActions.add({'name' : 'delete', 'url' : $deleteURL, 'icon' : 'cross', 'extraCssClass' : 'btn btn-xs btn-danger'}))
101 101   #end
102 102   #define($additionalContent)
103 103   #if ($isTemporaryAttachment)
... ... @@ -106,7 +106,7 @@
106 106   (% title="$titleMessage" %)$services.icon.render('clock')(%%)
107 107   #end
108 108   #end
109 - #attachmentPicker_displayEndFrame ($attachmentActions $additionalContent)
114 + #_attachmentPicker_displayEndFrame ($attachmentActions $additionalContent)
110 110  #end
111 111  
112 112  #**
... ... @@ -116,9 +116,10 @@
116 116   * the title to display (boxOptions.text), optional extra CSS classnames to put on the box (boxOptions.cssClass)
117 117   * @param $currentValue the currently selected file, used for determining if this attachment should be highlighted as the current value
118 118   *#
119 -#macro (attachmentPicker_displayStartFrame $boxOptions $currentValue)
124 +#macro (_attachmentPicker_displayStartFrame $boxOptions $currentValue)
120 120   (% class="gallery_attachmentbox $!{boxOptions.cssClass} #if ("$!{boxOptions.value}" == $currentValue) current#{end}" %)(((
121 121   (% class="gallery_attachmenttitle" title="$services.rendering.escape($!{boxOptions.value}, 'xwiki/2.1')" %)(((
127 + #if($!{boxOptions.cssClass} == 'gallery_upload')$services.icon.render('add') #end##
122 122   $services.rendering.escape($boxOptions.text, 'xwiki/2.1')
123 123   )))
124 124   (% class="gallery_attachmentframe" %)(((
... ... @@ -131,7 +131,7 @@
131 131   * @param $attachment the target attachment to display
132 132   * @param $options generic picker options
133 133   *#
134 -#macro (attachmentPicker_displayAttachmentDetails $attachment $options)
140 +#macro (_attachmentPicker_displayAttachmentDetails $attachment $options)
135 135   #if ($attachment)
136 136   ## Compute the attachment reference because there's no getter.
137 137   #set ($attachmentReference = $services.model.createAttachmentReference($attachment.document.documentReference,
... ... @@ -140,12 +140,12 @@
140 140   #if ($attachment.isImage() && $options.displayImage)
141 141   ## We add the version to the query string in order to invalidate the cache when an image attachment is replaced.
142 142   #set ($queryString = $escapetool.url({'version': $attachment.version}))
143 - [[[[image:$attachmentStringReference||width=180 queryString="$queryString"]]>>attach:$attachmentStringReference]]
149 + [[[[image:${attachmentStringReference}||width=180 queryString="$queryString"]]>>attach:$attachmentStringReference]]
144 144   #else
145 145   * (% 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')(% %)
146 146   * v$attachment.getVersion() (#dynamicsize($attachment.longSize))
147 147   * $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')}])
148 - * (% class="buttonwrapper" %)[[${services.localization.render("${translationPrefix}.actions.download")}>>attach:$attachmentStringReference||title="$services.localization.render("${translationPrefix}.actions.download")" rel="__blank" class="button"]](%%)
154 + * (% class="buttonwrapper" %)[[${services.localization.render("${translationPrefix}.actions.download")}>>attach:${attachmentStringReference}||title="$services.localization.render("${translationPrefix}.actions.download")" rel="__blank" class="button"]](%%)
149 149   #end
150 150   #end
151 151  #end
... ... @@ -164,12 +164,14 @@
164 164   * </dl>
165 165   * @param $additionalContent optional additional content that does not follow the structure of the actions
166 166   *#
167 -#macro (attachmentPicker_displayEndFrame $actions $additionalContent)
173 +#macro (_attachmentPicker_displayEndFrame $actions $additionalContent)
168 168   )))## attachmentframe
169 169   (% class="gallery_actions" %)(((
170 170   #foreach ($action in $actions)
171 171   #set( $actionname = $services.localization.render("${translationPrefix}.actions.${action.name}") )
172 - [[${actionname}>>path:${action.url}||class="tool ${action.name}" title="${actionname}" #if($action.rel) rel="${action.rel}"#end]]##
178 + [[${services.icon.render($action.icon)}(% class="sr-only"%)${actionname}(%%)>>##
179 + path:${action.url}||class="tool ${action.name} $!{action.extraCssClass}"##
180 + title="${actionname}" #if($action.rel) rel="${action.rel}"#end]]##
173 173   #end
174 174   $!additionalContent
175 175   )))## actions
... ... @@ -183,8 +183,8 @@
183 183   * @param $targetAttachDocument the document to upload the attachment to
184 184   * @param $options generic picker options
185 185   *#
186 -#macro (attachmentPicker_displayUploadForm $targetDocument, $targetAttachDocument, $options)
187 -#attachmentPicker_displayStartFrame({
194 +#macro (_attachmentPicker_displayUploadForm $targetDocument, $targetAttachDocument, $options)
195 +#_attachmentPicker_displayStartFrame({
188 188   'value' : $services.localization.render("${translationPrefix}.upload.title"),
189 189   'text' : $services.localization.render("${translationPrefix}.upload.title"),
190 190   'cssClass' : 'gallery_upload'
... ... @@ -231,7 +231,7 @@
231 231   </div>
232 232  </form>
233 233  {{/html}}
234 -#attachmentPicker_displayEndFrame ([])
242 +#_attachmentPicker_displayEndFrame ([])
235 235  #end
236 236  
237 237  #**
... ... @@ -242,7 +242,7 @@
242 242   * @param $options generic picker options
243 243   * @param $currentValue the currently selected file, used for determining if the empty box should be highlighted as the current value
244 244   *#
245 -#macro (attachmentPicker_displayAttachmentGalleryEmptyValue $targetDocument, $targetAttachDocument, $options, $currentValue)
253 +#macro (_attachmentPicker_displayAttachmentGalleryEmptyValue $targetDocument, $targetAttachDocument, $options, $currentValue)
246 246   #if ("$!{options.get('defaultValue')}" != '')
247 247   #set ($reference = ${options.get('defaultValue')})
248 248   #set ($docNameLimit = $reference.indexOf('@'))
... ... @@ -257,11 +257,11 @@
257 257   #set($dcssClass = 'gallery_image')
258 258   #end
259 259   #end
260 - #attachmentPicker_displayStartFrame({'cssClass' : "gallery_emptyChoice $!{dcssClass}", 'text' : $services.localization.render("${translationPrefix}.default"), 'value' : "${options.defaultValue}"} $currentValue)
261 - #attachmentPicker_displayAttachmentDetails($defaultAttachment $options)
268 + #_attachmentPicker_displayStartFrame({'cssClass' : "gallery_emptyChoice $!{dcssClass}", 'text' : $services.localization.render("${translationPrefix}.default"), 'value' : "${options.defaultValue}"} $currentValue)
269 + #_attachmentPicker_displayAttachmentDetails($defaultAttachment $options)
262 262   #set ($returnURL = $escapetool.url($doc.getURL('view', $request.queryString)))
263 263   #set ($selectURL = $targetDocument.getURL(${options.get('docAction')}, "${options.get('classname')}_${options.get('object')}_${options.get('property')}=&form_token=$!{services.csrf.getToken()}"))
264 - #attachmentPicker_displayEndFrame ([{'name' : 'select', 'url' : $selectURL}])
272 + #_attachmentPicker_displayEndFrame ([{'name' : 'select', 'url' : $selectURL, 'icon' : 'check', 'extraCssClass' : 'btn btn-xs btn-success'}])
265 265  #end
266 266  {{/velocity}}
267 267  
... ... @@ -315,7 +315,7 @@
315 315   #end
316 316   #set ($options = {
317 317   'classname' : ${request.get('classname')},
318 - 'object' : $!{mathtool.toInteger($request.object)},
326 + 'object' : $!{numbertool.toNumber($request.object).intValue()},
319 319   'property' : ${request.property},
320 320   'displayImage' : ${displayImage},
321 321   'docAction' : ${docAction},
... ... @@ -326,12 +326,12 @@
326 326   'versionSummary': $request.versionSummary.equals('true')
327 327   })
328 328   $!targetDocument.use($targetDocument.getObject($options.classname, $options.object))##
329 - #attachmentPicker_displayAttachmentGallery($targetDocument, $targetAttachDocument, $options)
337 + #_attachmentPicker_displayAttachmentGallery($targetDocument, $targetAttachDocument, $options)
330 330  
331 331   #set ($cancelLinkName = $services.rendering.escape($services.rendering.escape($services.localization.render("${translationPrefix}.cancel"), 'xwiki/2.1'), 'xwiki/2.1'))
332 332   #set ($cancelLinkTarget = $services.rendering.escape($services.model.serialize($targetDocument), 'xwiki/2.1'))
333 333   (% class="gallery_buttons buttons" %)(((
334 - (% class="buttonwrapper secondary" %)[[$services.localization.render("${translationPrefix}.cancel")>>$targetDocument||class="button secondary" id="attachment-picker-close"]]
342 + (% class="buttonwrapper secondary" %)[[$cancelLinkName>>$cancelLinkTarget||class="button secondary" id="attachment-picker-close"]]
335 335   )))
336 336  #end
337 337  {{/velocity}}
XWiki.JavaScriptExtension[0]
Code
... ... @@ -167,7 +167,7 @@
167 167   /** AJAX deletion of attachments. */
168 168   onDelete : function(event) {
169 169   event.stop();
170 - deleteTool = event.element();
170 + const deleteTool = event.target.closest('.btn');
171 171   if (!deleteTool.disabled) {
172 172   new XWiki.widgets.ConfirmedAjaxRequest(
173 173   deleteTool.readAttribute('href'),
... ... @@ -210,7 +210,7 @@
210 210   /** Update the property with the selected value without reloading the page. */
211 211   onSelect : function(event) {
212 212   event.stop();
213 - var targetElement = event.element();
213 + const targetElement = event.target.closest('.btn');
214 214   var attachmentName = targetElement.up('.gallery_attachmentbox').down('.gallery_attachmenttitle').title;
215 215   var imageSource = targetElement.up('.gallery_attachmentbox.gallery_image');
216 216   if (imageSource) {
... ... @@ -225,7 +225,7 @@
225 225   if (this.directSave) {
226 226   // save via ajax
227 227   if (!targetElement.disabled) {
228 - new Ajax.Request(event.element().href, {
228 + new Ajax.Request(targetElement.href, {
229 229   onCreate : function() {
230 230   targetElement.disabled = true;
231 231   targetElement._x_notif = new XWiki.widgets.Notification("$services.localization.render('core.widgets.confirmationBox.notification.inProgress')", 'inprogress');
XWiki.StyleSheetExtension[0]
Code
... ... @@ -25,9 +25,12 @@
25 25   margin: 0;
26 26  }
27 27  .gallery_attachmentbox {
28 + display: grid;
29 + gap: .2rem;
28 28   background: $theme.pageContentBackgroundColor;
31 + padding: .2rem;
29 29   border: 1px solid $theme.borderColor;
30 - border-radius: 5px;
33 + border-radius: var(--border-radius-base);
31 31   float: left;
32 32   margin: ${boxMargin}px;
33 33   overflow: hidden;
... ... @@ -36,8 +36,6 @@
36 36  }
37 37  .gallery .current {
38 38   background-color: $theme.highlightColor;
39 - border-width: 3px;
40 - margin: 3px;
41 41  }
42 42  .gallery .current .gallery_attachmenttitle {
43 43   font-weight: bold;
... ... @@ -47,9 +47,7 @@
47 47  }
48 48  
49 49  .gallery_attachmenttitle {
50 - background: $theme.backgroundSecondaryColor;
51 - border-bottom: 1px dotted $theme.borderColor;
52 - border-radius: 5px 5px 0px 0px;
51 + grid-area: 1 / 1 / 2 / 2;
53 53   font-size: 85%;
54 54   padding: 3px ${boxPadding}px;
55 55   overflow: hidden;
... ... @@ -62,7 +62,7 @@
62 62  }
63 63  
64 64  .gallery_attachmentframe {
65 - padding: ${boxPadding}px;
64 + grid-area: 2 / 1 / 3 / 3;
66 66   height: ${imgSize}px;
67 67   overflow: hidden;
68 68   position: relative;
... ... @@ -101,39 +101,16 @@
101 101  }
102 102  
103 103  /* Actions */
104 -.gallery_actions {
105 - width: auto;
106 - position: absolute;
107 - bottom: 0px;
108 - right: ${boxPadding}px;
103 +.gallery_actions p {
104 + grid-area: 1 / 2 / 2 / 3;
105 + display: flex;
106 + justify-content: flex-end;
107 + gap: .2rem;
109 109  }
110 110  .gallery_actions .tool {
111 - background: none no-repeat 50% transparent;
112 112   cursor: pointer;
113 113   display: block;
114 - float: left;
115 - height: ${actionsHeight}px;
116 - padding: 0 !important;
117 - overflow: hidden;
118 - text-indent: -1000em;
119 - opacity: 0.6;
120 - width: ${actionsWidth}px;
121 121  }
122 -.gallery_actions .tool:hover {
123 - opacity: 1;
124 -}
125 -.gallery_actions .select {
126 - background-image: url("$xwiki.getSkinFile('icons/silk/tick.png')");
127 -}
128 -.gallery_actions .delete {
129 - background-image: url("$xwiki.getSkinFile('icons/silk/cross.png')");
130 -}
131 -.gallery_actions .view {
132 - background-image: url("$xwiki.getSkinFile('icons/silk/link.png')");
133 -}
134 -.gallery_actions .download {
135 - background-image: url("$xwiki.getSkinFile('icons/silk/arrow_down.png')");
136 -}
137 137  /*--------------------------------------------------*/
138 138  /* Upload form */
139 139  .gallery_upload {
... ... @@ -144,12 +144,6 @@
144 144   background-color: $theme.backgroundSecondaryColor;
145 145  }
146 146  
147 -.gallery_upload .gallery_attachmenttitle {
148 - background-position: 1px center;
149 - background-image: url("$xwiki.getSkinFile('icons/silk/bullet_add.png')");
150 - background-repeat: no-repeat;
151 - padding-left: 16px;
152 -}
153 153  .gallery_upload .gallery_attachmentframe {
154 154   height: auto;
155 155  }
XWiki.WikiMacroClass[0]
Macro code
... ... @@ -3,7 +3,6 @@
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')##
7 7  ## Integrates the optional Lightbox widget (from http://extensions.xwiki.org/xwiki/bin/view/Extension/Lightbox+Application )
8 8  #if ($xwiki.exists('XWiki.Lightbox'))
9 9   $xwiki.jsx.use('XWiki.Lightbox')
... ... @@ -32,7 +32,7 @@
32 32  #end
33 33  #set ($classname = "$!{xcontext.macro.params.classname}")
34 34  #set ($property = "$!{xcontext.macro.params.property}")
35 -#set ($object = $mathtool.toInteger("$!{xcontext.macro.params.object}"))
34 +#set ($object = $numbertool.toNumber("$!{xcontext.macro.params.object}").intValue())
36 36  #if ("$!{object}" != $!{xcontext.macro.params.object})
37 37   #set ($object = ${targetdoc.getObject($classname).number})
38 38   #if ("$!{object}" == '')
... ... @@ -98,7 +98,7 @@
98 98  #set ($propValue = "$!{targetdoc.getObject($classname, $object).getProperty($property).value}")
99 99  ##
100 100  
101 -#macro (attachmentPicker_displayAttachment $name $displayImage $withLink $forceElement)
100 +#macro (_attachmentPicker_displayAttachment $name $displayImage $withLink $forceElement)
102 102   #set ($attachment = $targetdoc.getAttachment("$!{name}"))
103 103   #if ("$!{name}" != '' && "$!{attachment}" != '')
104 104   #set ($attachmentRef = $services.model.createAttachmentReference(${targetdoc.documentReference}, ${name}))
... ... @@ -131,7 +131,7 @@
131 131  ## Display the "Choose an attachment" button if they can:
132 132  ## 1. Edit the current page
133 133  ## 2. View the target attachment page. (can be the same page)
134 -#macro (attachmentPicker_displayButton)
133 +#macro (_attachmentPicker_displayButton)
135 135   #if ($targetPermView)
136 136   #set ($queryString = {
137 137   'docname': $doc.fullName,
... ... @@ -147,8 +147,9 @@
147 147   #if ($hasTargetDoc)
148 148   #set ($queryString.targetdocname = $targetdoc.fullName)
149 149   #end
150 - (% class="buttonwrapper" %)[[$buttontext>>$xcontext.macro.doc.fullName||queryString="$escapetool.url($queryString)"
151 - class="attachment-picker-start button" title="$buttontext"]](%%)##
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 152   #end
153 153  #end
154 154  {{/velocity}}
... ... @@ -155,13 +155,13 @@
155 155  
156 156  {{velocity}}
157 157  #if ("${savemode}" == 'direct')
158 - (% class="attachment-picker" %)(((#attachmentPicker_displayAttachment($propValue $displayImage $link true) #attachmentPicker_displayButton())))
158 + (% class="attachment-picker" %)(((#_attachmentPicker_displayAttachment($propValue $displayImage $link true) #_attachmentPicker_displayButton())))
159 159  #elseif ($xcontext.action == 'inline' || $xcontext.action == 'edit')
160 160   (% class="attachment-picker" %)(((##
161 - #attachmentPicker_displayAttachment($propValue $displayImage false true) #attachmentPicker_displayButton()##
161 + #_attachmentPicker_displayAttachment($propValue $displayImage false true) #_attachmentPicker_displayButton()##
162 162   {{html}}<input type="hidden" name="$escapetool.xml("${classname}_${object}_${property}")" value="$escapetool.xml("${propValue}")" class="property-reference"/>{{/html}}##
163 163   )))
164 164  #else
165 - #attachmentPicker_displayAttachment($propValue $displayImage $link false)
165 + #_attachmentPicker_displayAttachment($propValue $displayImage $link false)
166 166  #end
167 167  {{/velocity}}