Änderungen von Dokument View File Macro

Zuletzt geändert von xwikiadmin am 2025/01/07 12:27

Von Version 2.1
bearbeitet von xwikiadmin
am 2022/08/11 17:13
Änderungskommentar: Migrated property [defaultCategories] from class [XWiki.WikiMacroClass]
Auf Version 6.1
bearbeitet von xwikiadmin
am 2024/06/24 15:04
Änderungskommentar: Install extension [com.xwiki.pro:xwiki-pro-macros-ui/1.19.4]

Zusammenfassung

Details

Seiteneigenschaften
Inhalt
... ... @@ -1,3 +1,34 @@
1 -{{view-file name="Test.ppt" /}}
1 +The view-file macro displays attachments in a document, in place or as thumbnail and offers a preview.
2 2  
3 -{{view-file name="TestPDF.pdf" /}}
3 +Limitation: the thumbnail is actually only an icon for now.
4 +
5 += Parameters =
6 +
7 +|=Parameter|=Description|=Required|=Default
8 +|display|Kind of display. "button" for a button, "thumbnail" for a thumbnail, "full" to render the document in place|no|thumbnail (button in inline mode)
9 +|name|The attachment reference to display|if att-filename is not given|
10 +|width|The width of the view in % or px (e.g. 100%, 100px)|no|100% for the full view or 100px for the thumbnail
11 +|height|The height of the view in % or px (e.g. 100%, 100px)|no|1000px for the full view or 100px for the thumbnail
12 +|att-filename|Alias of name|If name is not given|
13 +
14 += Example Usage =
15 +
16 +Thumbnails side by side:
17 +
18 +{{view-file display="thumbnail" name="Test.ppt"/}} {{view-file display="thumbnail" name="TestPDF.pdf"/}}
19 +
20 +Or standalone:
21 +
22 +{{view-file name="Test.ppt"/}}
23 +
24 +In a paragraph: {{view-file name="Test.ppt"/}}
25 +
26 +
27 +Full PDF:
28 +
29 +{{view-file display="full" name="TestPDF.pdf"/}}
30 +
31 +Full Presentation:
32 +
33 +{{view-file display="full" name="Test.ppt"/}}
34 +
XWiki.WikiMacroClass[0]
Makro-Code
... ... @@ -1,18 +1,155 @@
1 -{{velocity}}
2 -#set($hasPDFViewer = $xwiki.exists("XWiki.PDFViewerMacro"))
3 -#set($officeExtensions = [ 'ppt', 'pptx', 'odp', 'doc', 'docx', 'odt', 'xls', 'xlsx', 'ods' ])
4 -#set($filename = $xcontext.macro.params.get('att--filename'))
5 -#if(!$filename)
6 - #set($filename = $xcontext.macro.params.get('name'))
1 +{{velocity output="false"}}
2 +#template('attachment_macros.vm')
3 +
4 +#set ($officeExtensions = [ 'ppt', 'pptx', 'odp', 'doc', 'docx', 'odt', 'xls', 'xlsx', 'ods' ])
5 +#set ($presentationExtensions = [ 'ppt', 'pptx', 'odp' ])
6 +#set ($hasPDFViewer = $xwiki.exists("XWiki.PDFViewerMacro"))
7 +
8 +#macro (renderThumbnailButton $attachmentRef $previewSupported $width $height $forceCard)
9 + #set ($style = "")
10 + #if ("$!width" != "")
11 + #set ($style = $style + " width: $width")
12 + #end
13 + #if ("$!height" != "")
14 + #set ($style = $style + " height: $height")
15 + #end
16 + #if ("$!style" != "")
17 + #set ($style = "style='$style.trim()'")
18 + #set ($thumbnailStyle = "Card")
19 + #elseif ($forceCard)
20 + #set ($style = "style='width: 100px; height: 100px;'")
21 + #set ($height = "100px")
22 + #set ($thumbnailStyle = "Card")
23 + #else
24 + #set ($thumbnailStyle = "Button")
25 + #end
26 + #if ($wikimacro.context.isInline() || $thumbnailStyle == "Button")
27 + #set ($elem = "span")
28 + #else
29 + #set ($elem = "div")
30 + #end
31 + #set ($attachment = $xwiki.getDocument($attachmentRef.getParent()).getAttachment($attachmentRef.getName()))
32 + #set ($thumbnail = "#displayAttachmentMimeType($attachment)")
33 + #if ($thumbnail.charAt(0) == '#')
34 + ## #displayAttachmentMimeType is not supported (before July 2022)
35 + #set ($thumbnail = '<div class="attachmentMimeType"><span><span class="fa fa-paperclip" aria-hidden="true"></span></span></div>')
36 + #end
37 + #if ($elem == "span")
38 + #set ($thumbnail = $thumbnail.replace('</div>', '</span>').replace('<div ', '<span '))
39 + #end
40 +
41 + {{html clean=false}}
42 + <$elem class="viewFileThumbnail viewFileThumbnail$thumbnailStyle" $style data-preview="$previewSupported" data-ref="$escapetool.xml($services.model.serialize($attachmentRef, 'default'))">
43 + <a href="$escapetool.xml($xwiki.getURL($attachmentRef))"
44 + download="download"
45 + #if ($thumbnailStyle == "Button") class="button button-primary" #end
46 + title="$escapetool.xml($services.localization.render('rendering.macro.viewFile.thumbnail.button.title'))"
47 + >
48 + $thumbnail
49 + <span class="viewFileName">$escapetool.xml($attachmentRef.getName())</span>
50 + </a>
51 + </$elem>
52 + {{/html}}
53 +
7 7  #end
8 -#set($extension = $filename.substring($mathtool.add($filename.lastIndexOf('.'), 1)).toLowerCase())
9 -#if($extension == 'pdf' && $hasPDFViewer)
10 10  
11 - {{pdfviewer file="${filename}" /}}
12 -#elseif($officeExtensions.contains($extension))
56 +#macro (renderFull $extension $attachmentRef $width $height)
57 + #set ($escapedAttachmentReference = $services.rendering.escape($attachmentRef, $xwiki.currentContentSyntaxId))
58 + #if ($officeExtensions.contains($extension))
13 13  
14 - {{office reference="attach:${filename}" /}}
15 -#elseif($doc.getAttachment($filename))
16 - [[attach:${filename}]]
60 + {{html clean=false}}
61 + <div class="viewFileFull#if (!$presentationExtensions.contains($extension)) box#end"
62 + style="width: $width; height: $height; overflow: auto">
63 + {{/html}}
64 +
65 + {{office reference="$escapedAttachmentReference" /}}
66 +
67 + {{html clean=false}}
68 + </div>
69 + {{/html}}
70 +
71 + #elseif ($extension == 'pdf' && $hasPDFViewer)
72 + #if ($height.endsWith("px"))
73 + #set ($height = $stringtool.removeEnd($height, "px"))
74 + #end
75 + #if ($width.endsWith("px"))
76 + #set ($width = $stringtool.removeEnd($width, "px"))
77 + #end
78 +
79 + {{pdfviewer file="$escapedAttachmentReference" height="$height" width="$width"/}}
80 +
81 + #else
82 + #renderThumbnailButton($attachmentRef false $width $height)
83 + #end
17 17  #end
85 +
86 +#macro (executeMacro)
87 + #set($unescapedFilename = $xcontext.macro.params.get('att--filename'))
88 + #if(!$unescapedFilename)
89 + #set($unescapedFilename = $xcontext.macro.params.get('name'))
90 + #end
91 + #if(!$unescapedFilename)
92 +
93 + {{error}}
94 + $escapetool.xml($services.localization.render('rendering.macro.viewFile.namerequired'))"
95 + {{/error}}
96 + #end
97 + #continueExecutingMacro##
98 +#end
99 +
100 +#macro (continueExecutingMacro)
101 + #set ($attachmentRef = $services.model.resolveAttachment($unescapedFilename))
102 + #set ($discard = $xwiki.ssx.use('Confluence.Macros.ViewFile'))
103 + #set ($extension = $unescapedFilename.substring($unescapedFilename.lastIndexOf('.') + 1).toLowerCase())
104 + #set ($width = $xcontext.macro.params.get('width'))
105 + #set ($height = $xcontext.macro.params.get('height'))
106 + #set ($display = $xcontext.macro.params.get('display'))
107 + #if ("$!width" != "")
108 + #set ($width = $escapetool.xml($width))
109 + #if (!$width.endsWith("%") && !$width.endsWith("px"))
110 + #set($width = $width + "px")
111 + #end
112 + #end
113 + #if ("$!height" != "")
114 + #set ($height = $escapetool.xml($height))
115 + #if (!$height.endsWith("%") && !$height.endsWith("px"))
116 + #set($height = $height + "px")
117 + #end
118 + #end
119 + #if (($display == 'FULL' || $display == 'full') && ($wikimacro.context.isInline() || ($xcontext.action == "edit" || $request.outputSyntax == "annotatedhtml")))
120 + #set ($display = "thumbnail")
121 + #end
122 + #if ($display == 'FULL' || $display == 'full')
123 + #if ("$!width" == "")
124 + #set ($width = "100%")
125 + #end
126 + #if ("$!height" == "")
127 + #set ($height = "1000px")
128 + #end
129 + #renderFull($extension $attachmentRef $width $height)
130 + #else
131 + ## thumbnail or fallback
132 + #set ($hasPreview = ($extension == 'pdf' && $hasPDFViewer) || $officeExtensions.contains($extension))
133 + #if ($hasPreview)
134 + #set ($discard = $xwiki.jsx.use('Confluence.Macros.ViewFile'))
135 + #end
136 + #set ($forceCard = ($display == 'THUMBNAIL' || $display == 'thumbnail' || ("$!display" == "" && !$wikimacro.context.isInline())))
137 + #if ($presentationExtensions.contains($extension))
138 + #set ($discard = $xwiki.jsfx.use("uicomponents/widgets/gallery/gallery.js", {"forceSkinAction": true}))
139 + #set ($discard = $xwiki.ssfx.use("uicomponents/widgets/gallery/gallery.css"))
140 + #end
141 + #renderThumbnailButton($attachmentRef $hasPreview $width $height $forceCard)
142 + #end
143 +#end
18 18  {{/velocity}}
145 +
146 +{{velocity}}
147 +## We need to check if there is a valid license because the macro is registered even if the user doesn't have view right
148 +## on the macro definition page. See XWIKI-14828: Rendering macros defined in wiki pages are available to users that
149 +## don't have view right on those pages.
150 +#if ($services.promacrolicensing.hasLicensureForEntity($xcontext.macro.doc.documentReference))##
151 + #executeMacro##
152 +#else
153 + {{missingLicenseMessage extensionName="proMacros.extension.name"/}}
154 +#end
155 +{{/velocity}}
Verfügbarkeit von Makroinhalten
... ... @@ -1,1 +1,1 @@
1 -Optional
1 +No content
Standardkategorie
... ... @@ -1,1 +1,0 @@
1 -content
Unterstützt Inline-Modus
... ... @@ -1,1 +1,1 @@
1 -Nein
1 +Ja
XWiki.WikiMacroParameterClass[0]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Alias of name (here for compatibility reasons)
Parameter verpflichtend
... ... @@ -1,0 +1,1 @@
1 +Nein
Parameter-Typ
... ... @@ -1,0 +1,1 @@
1 +org.xwiki.model.reference.AttachmentReference
XWiki.JavaScriptExtension[0]
Pufferstrategie
... ... @@ -1,0 +1,1 @@
1 +long
Code
... ... @@ -1,0 +1,33 @@
1 +window.addEventListener("DOMContentLoaded", function () {
2 + "use strict";
3 + document.addEventListener("click", async function (e) {
4 + if (("" + document.getElementById("xwikicontent")?.contentEditable) == "true") {
5 + return;
6 + }
7 + const viewFile = e.target?.closest(".viewFileThumbnail");
8 + if (viewFile && viewFile.dataset.preview === 'true') {
9 + const popup = new XWiki.widgets.ModalPopup();
10 + popup.createDialog();
11 + popup.setContent("<span class='fa fa-spinner'></span>");
12 + popup.dialogBox.classList.add("viewFileModal");
13 + popup.dialogBox.style.top = "2.5vh";
14 + popup.dialogBox.style.width = "95vw";
15 + popup.dialogBox.style.height = "95vh";
16 + const a = e.target.closest('a');
17 + const downloadLink = document.createElement("a");
18 + downloadLink.download = true;
19 + downloadLink.textContent = a.textContent;
20 + downloadLink.className = "fa fa-download button button-primary viewFileModal-downloadLink";
21 + downloadLink.href = a.href;
22 + popup.dialogBox.insertBefore(downloadLink, popup.dialogBox.firstChild)
23 + popup.showDialog();
24 + e.preventDefault();
25 + const response = await fetch(XWiki.contextPath + "/wiki/" + XWiki.currentWiki + "/get/Confluence/Macros/ViewFileService?action=render&attachment=" + encodeURIComponent(viewFile.dataset.ref));
26 + popup.setContent(await response.text());
27 + const gallery = popup.dialogBox.querySelector(".gallery");
28 + if (gallery) {
29 + new XWiki.Gallery(gallery);
30 + }
31 + }
32 + });
33 +});
Inhalt parsen
... ... @@ -1,0 +1,1 @@
1 +Nein
Benutze diese Erweiterung
... ... @@ -1,0 +1,1 @@
1 +onDemand
XWiki.StyleSheetExtension[0]
Pufferstrategie
... ... @@ -1,0 +1,1 @@
1 +long
Code
... ... @@ -1,0 +1,74 @@
1 +.viewFileModal iframe, .viewFileModal .xdialog-content {
2 + height: calc(95vh - 5em);
3 +}
4 +
5 +.viewFileModal .xGallery, .viewFileFull .xGallery {
6 + height: 100%;
7 + width: 100%;
8 +}
9 +
10 +.viewFileModal .xdialog-content:before {
11 + clear: both;
12 +}
13 +
14 +.viewFileModal .xdialog-content {
15 + overflow: auto;
16 + margin:0 0.8em 0.8em 0.8em;
17 + width: calc(100% - 1.6em);
18 +}
19 +
20 +.viewFileContentThumb .modal-dialog {
21 + max-height: 90vh;
22 + width: 80%;
23 +}
24 +
25 +.viewFileContentThumb .modal-body {
26 + max-height: 80vh;
27 + overflow: auto;
28 +}
29 +
30 +.viewFileContentThumb.viewFilePresentation .modal-dialog {
31 + height: 90%;
32 + width: 90%;
33 + display: flex;
34 + flex-direction: column;
35 + align-items: center;
36 +}
37 +
38 +.viewFileThumbnailButton {
39 + display: inline-block;
40 + padding-right: 0.5ex;
41 +}
42 +
43 +.viewFileThumbnailCard, .viewFileFull {
44 + position: relative;
45 +}
46 +
47 +span.viewFileThumbnailCard {
48 + display: inline-block;
49 +}
50 +
51 +.viewFileThumbnailCard a {
52 + display: flex;
53 + gap: 3px;
54 + flex-direction: column;
55 + text-align: center;
56 + width: 100%;
57 + height: 100%;
58 +}
59 +
60 +.viewFileThumbnailCard a .attachmentMimeType {
61 + flex: 1;
62 + display: flex;
63 + align-items: center;
64 + align-self: center;
65 + text-align: center;
66 + justify-content: center;
67 + width: 100%;
68 + border: 1px solid;
69 + border-radius: 1rem;
70 +}
71 +
72 +.viewFileModal-downloadLink {
73 + margin-left: 2px;
74 +}
Content Type
... ... @@ -1,0 +1,1 @@
1 +CSS
Name
... ... @@ -1,0 +1,1 @@
1 +viewFileCSS
Inhalt parsen
... ... @@ -1,0 +1,1 @@
1 +Nein
Benutze diese Erweiterung
... ... @@ -1,0 +1,1 @@
1 +onDemand
XWiki.WikiMacroParameterClass[1]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +The width of the view in % or px (e.g. 100%, 100px)
Parameter verpflichtend
... ... @@ -1,0 +1,1 @@
1 +Nein
Parameter-Name
... ... @@ -1,0 +1,1 @@
1 +width
XWiki.WikiMacroParameterClass[2]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +The height of the view in % or px (e.g. 100%, 100px)
Parameter verpflichtend
... ... @@ -1,0 +1,1 @@
1 +Nein
Parameter-Name
... ... @@ -1,0 +1,1 @@
1 +height
XWiki.WikiMacroParameterClass[3]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Kind of display. "button" for a button, "thumbnail" for a thumbnail, "full" to render the document in place
Parameter verpflichtend
... ... @@ -1,0 +1,1 @@
1 +Nein
Parameter-Name
... ... @@ -1,0 +1,1 @@
1 +display
Parameter-Typ
... ... @@ -1,0 +1,1 @@
1 +com.xwiki.macros.internal.ViewFileDisplay
XWiki.WikiMacroParameterClass[4]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +The attachment reference to display
Parameter verpflichtend
... ... @@ -1,0 +1,1 @@
1 +Nein
Parameter-Name
... ... @@ -1,0 +1,1 @@
1 +name
Parameter-Typ
... ... @@ -1,0 +1,1 @@
1 +org.xwiki.model.reference.AttachmentReference