Changes for page Attachments
Last modified by Сергей Коршунов on 2025/09/03 11:22
From version 18.1
edited by Сергей Коршунов
on 2025/09/03 11:22
on 2025/09/03 11:22
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-attachment-ui/17.7.0]
To version 2.1
edited by Сергей Коршунов
on 2022/02/09 16:13
on 2022/02/09 16:13
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-attachment-ui/14.0]
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Objects (3 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -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,19 +45,16 @@ 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}") ) 48 + #if ($xwiki.hasAccessLevel('edit',$xcontext.user,${targetAttachDocument.fullName})) 49 + #attachmentPicker_displayUploadForm($targetDocument, $targetAttachDocument, $options) 55 55 #end 51 + #attachmentPicker_displayAttachmentGalleryEmptyValue($targetDocument, $targetAttachDocument, $options, $currentValue) 52 + #set ($sortedAttachments = $collectiontool.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()) 59 59 #if ($options.filter.size() == 0 || $options.filter.contains($extension)) 60 - # _attachmentPicker_displayAttachmentBox($attachment $targetDocument $targetAttachDocument, $options $currentValue)57 + #attachmentPicker_displayAttachmentBox($attachment $targetDocument $targetAttachDocument, $options $currentValue) 61 61 #end 62 62 #end 63 63 ))) ... ... @@ -71,47 +71,19 @@ 71 71 * @param $options generic picker options 72 72 * @param $currentValue the currently selected file, used for determining if the box should be highlighted as the current value 73 73 *# 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) 71 +#macro (attachmentPicker_displayAttachmentBox $attachment $targetDocument $targetAttachDocument, $options $currentValue) 72 + #if ($options.displayImage && $attachment.isImage()) 73 + #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) 75 + #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) 93 - #_attachmentPicker_displayAttachmentDetails($attachment $options) 77 + #attachmentPicker_displayStartFrame({'value' : $attachment.filename, 'text' : $attachment.filename, 'cssClass' : "$!{cssClass}"} $currentValue) 78 + #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, 'icon' : 'check', 'extraCssClass' : 'btn btn-xs btn-success'}]) 104 - #if($canDeleteAttachment) 105 - #set ($discard = $attachmentActions.add({'name' : 'delete', 'url' : $deleteURL, 'icon' : 'cross', 'extraCssClass' : 'btn btn-xs btn-danger'})) 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) 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}]) 115 115 #end 116 116 117 117 #** ... ... @@ -121,12 +121,9 @@ 121 121 * the title to display (boxOptions.text), optional extra CSS classnames to put on the box (boxOptions.cssClass) 122 122 * @param $currentValue the currently selected file, used for determining if this attachment should be highlighted as the current value 123 123 *# 124 -#macro ( _attachmentPicker_displayStartFrame $boxOptions $currentValue)93 +#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 - #if($!{boxOptions.cssClass} == 'gallery_upload')$services.icon.render('add') #end## 128 - $services.rendering.escape($boxOptions.text, 'xwiki/2.1') 129 - ))) 95 + (% class="gallery_attachmenttitle" title="$!{boxOptions.value}" %)((($boxOptions.text))) 130 130 (% class="gallery_attachmentframe" %)((( 131 131 #end 132 132 ... ... @@ -137,18 +137,18 @@ 137 137 * @param $attachment the target attachment to display 138 138 * @param $options generic picker options 139 139 *# 140 -#macro ( _attachmentPicker_displayAttachmentDetails $attachment $options)106 +#macro (attachmentPicker_displayAttachmentDetails $attachment $options) 141 141 #if ($attachment) 142 142 ## Compute the attachment reference because there's no getter. 143 143 #set ($attachmentReference = $services.model.createAttachmentReference($attachment.document.documentReference, 144 144 $attachment.filename)) 145 - #set ($attachmentStringReference = $services. rendering.escape($services.model.serialize($attachmentReference, 'default'), 'xwiki/2.1'))111 + #set ($attachmentStringReference = $services.model.serialize($attachmentReference, 'default')) 146 146 #if ($attachment.isImage() && $options.displayImage) 147 147 ## We add the version to the query string in order to invalidate the cache when an image attachment is replaced. 148 148 #set ($queryString = $escapetool.url({'version': $attachment.version})) 149 149 [[[[image:${attachmentStringReference}||width=180 queryString="$queryString"]]>>attach:$attachmentStringReference]] 150 150 #else 151 - * (% 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')(% %)117 + * (% class="mime" %){{html wiki=false clean=false}}#mimetypeimg($attachment.getMimeType().toLowerCase() $attachment.getFilename().toLowerCase()){{/html}}(%%) (% class="filename" %)$attachment.getFilename()(% %) 152 152 * v$attachment.getVersion() (#dynamicsize($attachment.longSize)) 153 153 * $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')}]) 154 154 * (% class="buttonwrapper" %)[[${services.localization.render("${translationPrefix}.actions.download")}>>attach:${attachmentStringReference}||title="$services.localization.render("${translationPrefix}.actions.download")" rel="__blank" class="button"]](%%) ... ... @@ -168,18 +168,14 @@ 168 168 * <dt>rel</dt> 169 169 * <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> 170 170 * </dl> 171 - * @param $additionalContent optional additional content that does not follow the structure of the actions 172 172 *# 173 -#macro ( _attachmentPicker_displayEndFrame $actions$additionalContent)138 +#macro (attachmentPicker_displayEndFrame $actions) 174 174 )))## attachmentframe 175 175 (% class="gallery_actions" %)((( 176 176 #foreach ($action in $actions) 177 177 #set( $actionname = $services.localization.render("${translationPrefix}.actions.${action.name}") ) 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]]## 143 + [[${actionname}>>path:${action.url}||class="tool ${action.name}" title="${actionname}" #if($action.rel) rel="${action.rel}"#end]]## 181 181 #end 182 - $!additionalContent 183 183 )))## actions 184 184 )))## attachmentbox 185 185 #end ... ... @@ -191,8 +191,8 @@ 191 191 * @param $targetAttachDocument the document to upload the attachment to 192 192 * @param $options generic picker options 193 193 *# 194 -#macro ( _attachmentPicker_displayUploadForm $targetDocument, $targetAttachDocument, $options)195 -# _attachmentPicker_displayStartFrame({156 +#macro (attachmentPicker_displayUploadForm $targetDocument, $targetAttachDocument, $options) 157 +#attachmentPicker_displayStartFrame({ 196 196 'value' : $services.localization.render("${translationPrefix}.upload.title"), 197 197 'text' : $services.localization.render("${translationPrefix}.upload.title"), 198 198 'cssClass' : 'gallery_upload' ... ... @@ -239,7 +239,7 @@ 239 239 </div> 240 240 </form> 241 241 {{/html}} 242 -# _attachmentPicker_displayEndFrame ([])204 +#attachmentPicker_displayEndFrame ([]) 243 243 #end 244 244 245 245 #** ... ... @@ -250,7 +250,7 @@ 250 250 * @param $options generic picker options 251 251 * @param $currentValue the currently selected file, used for determining if the empty box should be highlighted as the current value 252 252 *# 253 -#macro ( _attachmentPicker_displayAttachmentGalleryEmptyValue $targetDocument, $targetAttachDocument, $options, $currentValue)215 +#macro (attachmentPicker_displayAttachmentGalleryEmptyValue $targetDocument, $targetAttachDocument, $options, $currentValue) 254 254 #if ("$!{options.get('defaultValue')}" != '') 255 255 #set ($reference = ${options.get('defaultValue')}) 256 256 #set ($docNameLimit = $reference.indexOf('@')) ... ... @@ -265,11 +265,11 @@ 265 265 #set($dcssClass = 'gallery_image') 266 266 #end 267 267 #end 268 - # _attachmentPicker_displayStartFrame({'cssClass' : "gallery_emptyChoice $!{dcssClass}", 'text' : $services.localization.render("${translationPrefix}.default"), 'value' : "${options.defaultValue}"} $currentValue)269 - # _attachmentPicker_displayAttachmentDetails($defaultAttachment $options)230 + #attachmentPicker_displayStartFrame({'cssClass' : "gallery_emptyChoice $!{dcssClass}", 'text' : $services.localization.render("${translationPrefix}.default"), 'value' : "${options.defaultValue}"} $currentValue) 231 + #attachmentPicker_displayAttachmentDetails($defaultAttachment $options) 270 270 #set ($returnURL = $escapetool.url($doc.getURL('view', $request.queryString))) 271 271 #set ($selectURL = $targetDocument.getURL(${options.get('docAction')}, "${options.get('classname')}_${options.get('object')}_${options.get('property')}=&form_token=$!{services.csrf.getToken()}")) 272 - # _attachmentPicker_displayEndFrame ([{'name' : 'select', 'url' : $selectURL, 'icon' : 'check', 'extraCssClass' : 'btn btn-xs btn-success'}])234 + #attachmentPicker_displayEndFrame ([{'name' : 'select', 'url' : $selectURL}]) 273 273 #end 274 274 {{/velocity}} 275 275 ... ... @@ -334,12 +334,10 @@ 334 334 'versionSummary': $request.versionSummary.equals('true') 335 335 }) 336 336 $!targetDocument.use($targetDocument.getObject($options.classname, $options.object))## 337 - # _attachmentPicker_displayAttachmentGallery($targetDocument, $targetAttachDocument, $options)299 + #attachmentPicker_displayAttachmentGallery($targetDocument, $targetAttachDocument, $options) 338 338 339 - #set ($cancelLinkName = $services.rendering.escape($services.rendering.escape($services.localization.render("${translationPrefix}.cancel"), 'xwiki/2.1'), 'xwiki/2.1')) 340 - #set ($cancelLinkTarget = $services.rendering.escape($services.model.serialize($targetDocument), 'xwiki/2.1')) 341 341 (% class="gallery_buttons buttons" %)((( 342 - (% class="buttonwrapper secondary" %)[[$can celLinkName>>$cancelLinkTarget||class="button secondary" id="attachment-picker-close"]]302 + (% class="buttonwrapper secondary" %)[[$services.localization.render("${translationPrefix}.cancel")>>${targetDocument}||class="button secondary" id="attachment-picker-close"]] 343 343 ))) 344 344 #end 345 345 {{/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 /** ... ... @@ -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('input[type="file"]').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));
- XWiki.StyleSheetExtension[0]
-
- Code
-
... ... @@ -25,12 +25,9 @@ 25 25 margin: 0; 26 26 } 27 27 .gallery_attachmentbox { 28 - display: grid; 29 - gap: .2rem; 30 30 background: $theme.pageContentBackgroundColor; 31 - padding: .2rem; 32 32 border: 1px solid $theme.borderColor; 33 - border-radius: var(--border-radius-base);30 + border-radius: 5px; 34 34 float: left; 35 35 margin: ${boxMargin}px; 36 36 overflow: hidden; ... ... @@ -39,6 +39,8 @@ 39 39 } 40 40 .gallery .current { 41 41 background-color: $theme.highlightColor; 39 + border-width: 3px; 40 + margin: 3px; 42 42 } 43 43 .gallery .current .gallery_attachmenttitle { 44 44 font-weight: bold; ... ... @@ -48,7 +48,9 @@ 48 48 } 49 49 50 50 .gallery_attachmenttitle { 51 - grid-area: 1 / 1 / 2 / 2; 50 + background: $theme.backgroundSecondaryColor; 51 + border-bottom: 1px dotted $theme.borderColor; 52 + border-radius: 5px 5px 0px 0px; 52 52 font-size: 85%; 53 53 padding: 3px ${boxPadding}px; 54 54 overflow: hidden; ... ... @@ -61,7 +61,7 @@ 61 61 } 62 62 63 63 .gallery_attachmentframe { 64 - grid-area:2 / 1 / 3 / 3;65 + padding: ${boxPadding}px; 65 65 height: ${imgSize}px; 66 66 overflow: hidden; 67 67 position: relative; ... ... @@ -100,16 +100,39 @@ 100 100 } 101 101 102 102 /* Actions */ 103 -.gallery_actions p{104 - grid-area:1 / 2 / 2 / 3;105 - display:flex;106 - justify-content:flex-end;107 - g ap:.2rem;104 +.gallery_actions { 105 + width: auto; 106 + position: absolute; 107 + bottom: 0px; 108 + right: ${boxPadding}px; 108 108 } 109 109 .gallery_actions .tool { 111 + background: none no-repeat 50% transparent; 110 110 cursor: pointer; 111 111 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; 112 112 } 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 +} 113 113 /*--------------------------------------------------*/ 114 114 /* Upload form */ 115 115 .gallery_upload { ... ... @@ -120,6 +120,12 @@ 120 120 background-color: $theme.backgroundSecondaryColor; 121 121 } 122 122 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 +} 123 123 .gallery_upload .gallery_attachmentframe { 124 124 height: auto; 125 125 }
- XWiki.WikiMacroClass[0]
-
- Macro code
-
... ... @@ -33,7 +33,7 @@ 33 33 #set ($property = "$!{xcontext.macro.params.property}") 34 34 #set ($object = $numbertool.toNumber("$!{xcontext.macro.params.object}").intValue()) 35 35 #if ("$!{object}" != $!{xcontext.macro.params.object}) 36 - #set ($object = ${ targetdoc.getObject($classname).number})36 + #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 48 + #set ($alt = "$!{xcontext.macro.params.alternateText}") 49 + #set ($width = "$!{xcontext.macro.params.width}") 50 + #set ($height = "$!{xcontext.macro.params.height}") 60 60 #set ($imageParams = '') 61 61 #if ("${width}" != '') 62 62 #set($imageParams = "$!{imageParams} width=${width}") ... ... @@ -94,10 +94,10 @@ 94 94 #set ($savemode = 'form') 95 95 #end 96 96 97 -#set ($propValue = "$!{ targetdoc.getObject($classname, $object).getProperty($property).value}")88 +#set ($propValue = "$!{doc.getObject($classname, $object).getProperty($property).value}") 98 98 ## 99 99 100 -#macro ( _attachmentPicker_displayAttachment $name $displayImage $withLink $forceElement)91 +#macro (attachmentPicker_displayAttachment $name $displayImage $withLink $forceElement) 101 101 #set ($attachment = $targetdoc.getAttachment("$!{name}")) 102 102 #if ("$!{name}" != '' && "$!{attachment}" != '') 103 103 #set ($attachmentRef = $services.model.createAttachmentReference(${targetdoc.documentReference}, ${name})) ... ... @@ -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)))##115 + (% 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 - services.rendering.escape($!{attachmentName}, 'xwiki/2.1')}#{else}Access Denied#{end}(% %)#{end}#end(%%)##117 + (% 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 ... ... @@ -130,8 +130,8 @@ 130 130 ## Display the "Choose an attachment" button if they can: 131 131 ## 1. Edit the current page 132 132 ## 2. View the target attachment page. (can be the same page) 133 -#macro ( _attachmentPicker_displayButton)134 - #if ($targetPermView) 124 +#macro (attachmentPicker_displayButton) 125 + #if ($hasEdit && $targetPermView) 135 135 #set ($queryString = { 136 136 'docname': $doc.fullName, 137 137 'classname': $classname, ... ... @@ -146,9 +146,8 @@ 146 146 #if ($hasTargetDoc) 147 147 #set ($queryString.targetdocname = $targetdoc.fullName) 148 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')"]](%%)## 140 + (% class="buttonwrapper" %)[[$buttontext>>${xcontext.macro.doc.fullName}||queryString="$escapetool.url($queryString)" 141 + class="attachment-picker-start button" title="$buttontext"]](%%)## 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())))148 + (% 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()##162 - {{html}}<input type="hidden" name="$ escapetool.xml("${classname}_${object}_${property}")"value="$escapetool.xml("${propValue}")" class="property-reference"/>{{/html}}##151 + #attachmentPicker_displayAttachment($propValue $displayImage false true) #attachmentPicker_displayButton()## 152 + {{html}}<input type="hidden" name="${classname}_${object}_${property}" value="${propValue}"/>{{/html}}## 163 163 ))) 164 164 #else 165 - # _attachmentPicker_displayAttachment($propValue $displayImage $link false)155 + #attachmentPicker_displayAttachment($propValue $displayImage $link false) 166 166 #end 167 167 {{/velocity}} - Default category
-
... ... @@ -1,0 +1,1 @@ 1 +Development - Default categories
-
... ... @@ -1,1 +1,0 @@ 1 -Development