Version 3.1 von Daniel Herrmann am 2025/09/20 09:54

Verstecke letzte Bearbeiter
admin 1.1 1 {{velocity}}
2 #####################################
3 ## XWikiSkins Sheet
4 #####################################
5 #set($discard = $xwiki.ssx.use('SkinsCode.XWikiSkinsSheet'))
6 #set($discard = $xwiki.jsx.use('SkinsCode.XWikiSkinsSheet'))
7 #set($discard = $services.localization.use('document', 'SkinsCode.Translations'))
8 #####################
9 ## CONTROLLER
10 #####################
11 ## Keep testing the inline action for backward compatibility with existing skin documents.
12 #if ($xcontext.action == 'edit' || $xcontext.action == 'inline')
13 #edit()
14 #elseif ($xcontext.action == 'get')
15 #if($request.action == 'newObj')
16 #newObj()
17 #elseif($request.action == 'displayObj')
18 #set($obj = $doc.getObject('XWiki.XWikiSkinFileOverrideClass', $numbertool.toNumber($request.objNumber).intValue()))
19 #displayOverrideObject($obj)
20 #elseif($request.action == 'deleteObj')
21 #deleteObj()
22 #end
23 #else
24 #view()
25 #end
26 #####################
27 ## VIEW
28 #####################
29 #macro(view)
30 ## Call getDefaultEditMode() for backward compatibility with existing skins.
31 * [[{{translation key="xe.admin.skin.editskin"/}}>>path:${services.rendering.escape($doc.getURL($doc.getDefaultEditMode()), 'xwiki/2.1')}]]
32 * [[{{translation key="xe.admin.skin.testskin"/}}>>${services.rendering.escape($services.model.resolveDocument('', 'default', $doc.documentReference.extractReference('WIKI')), 'xwiki/2.1')}||queryString="${services.rendering.escape($escapetool.url({"skin": $doc.fullName}), 'xwiki/2.1')}"]]
33 #end
34 #####################
35 ## EDIT
36 #####################
37 #macro(edit)
38 == {{translation key="skin.sheet.properties" /}} ==
39 ## Display the class properties
40 #set ($deprecatedProperties = [])
41 #set ($className = 'XWiki.XWikiSkins')
42 #set ($class = $doc.getObject($className).xWikiClass)
43 #foreach ($prop in $class.properties)
44 #if ($prop.classType != 'TextArea')
45 ; {{html}}<label for="${className}_$escapetool.xml($doc.getObject($className).getNumber())_$escapetool.xml($prop.name)">$escapetool.xml($prop.prettyName)</label>{{/html}}
46 : #if($prop.name == 'logo')## Avoid line break
47 {{attachmentSelector classname="${className}" property="${services.rendering.escape($prop.name, 'xwiki/2.1')}" filter="png,jpg,gif,svg" displayImage="true"/}}## Avoid line break
48 #else$doc.display($prop.name)#end
49
50 #else
51 #set($discard = $deprecatedProperties.add($prop))
52 #end
53 #end
54 (% id="overrideSection" %)
55 (((
56 == {{translation key="skin.sheet.overriddenTemplates" /}} ==
57
58 {{warning}}
59 {{translation key="skin.sheet.overrideTemplateWarning" /}}
60 {{/warning}}
61
62 {{html}}
63 <noscript>
Daniel Herrmann 2.1 64 #error($escapetool.xml($services.localization.render('skin.sheet.nojs', ['LINK_START', 'LINK_END', 'XWiki.XWikiSkinFileOverrideClass'])).replace('LINK_START', "<a href='$escapetool.xml($doc.getURL('edit', 'editor=object'))'>").replace('LINK_END', '</a>'))
admin 1.1 65 </noscript>
66 {{/html}}
67
68 {{html}}
69 <div id="addOverride">
70 <label for="newPath" class="newPathLabel">$services.icon.renderHTML('add') $escapetool.xml($services.localization.render("skin.sheet.addTemplate"))</label>
71 <input placeholder="file.vm" id="newPath" name="newPath" value="file.vm" size="20" class="withTip" type="text" />
72 <button class="btn btn-primary" id="newPathAdd">$escapetool.xml($services.localization.render("skin.sheet.add"))</button>
73 </div>
74 {{/html}}
75 ## Display the XWiki.XWikiSkinFileOverrideClass objects
76 #foreach ($obj in $doc.getObjects('XWiki.XWikiSkinFileOverrideClass'))
77 #displayOverrideObject($obj)
78 #end
79 )))
80
81 #if ($deprecatedProperties.size() > 0)
82 (% class="deprecatedProperties" %)
83 (((
84 == {{translation key="skin.sheet.deprecatedProperties" /}} ==
85
86 {{warning}}
87 {{translation key="skin.sheet.deprecatedPropertiesWarning" /}}
88 {{/warning}}
89
90 #foreach ($prop in $deprecatedProperties)
91 #if ($prop.classType == 'TextArea')
92 ; $services.icon.render('file-white') $services.rendering.escape($prop.prettyName, 'xwiki/2.1')
93 : $doc.display($prop.name)
94
95 #end
96 #end
97 )))
98 #end
99 #end
100 ###########################
101 ## DISPLAY OVERRIDE OBJ
102 ###########################
103 #macro(displayOverrideObject $obj)
104 (% class="overrideObject" %)
105 (((
106 (% class="overrideTitle" %)
107 === $services.icon.render('file-white') $obj.display('path', 'view') ===
108 (% class="overrideObjectDelete" %)
109 (((
110 {{html}}<button class="btn btn-default btn-xs">$services.icon.renderHTML('cross')</button>{{/html}}
111 )))
112 (% class="overrideProperties hidden" %)
113 (((
114 #set ($className = 'XWiki.XWikiSkinFileOverrideClass')
115 #set ($class = $doc.getObject($className).xWikiClass)
116 #foreach ($prop in $class.properties)
117 ; $services.rendering.escape($prop.prettyName, 'xwiki/2.1')
118 : $obj.display($prop.name, 'edit')
119
120 #end
121 )))
122 ----
123 )))
124 #end
125 ###########################
126 ## CHECK RIGHTS
127 ###########################
128 #macro(checkRights $response)
129 #if(!$services.csrf.isTokenValid($request.form_token))
130 #set($discard = $response.put('status', 'fail'))
131 #set($discard = $response.put('cause', 'form_token'))
132 #elseif(!$xwiki.hasAccessLevel('edit', $xcontext.user, $doc.fullname))
133 #set($discard = $response.put('status', 'fail'))
134 #set($discard = $response.put('cause', 'rights'))
135 #end
136 #end
137 ###########################
138 ## NEW OBJ
139 ###########################
140 #macro(newObj)
141 #set($response = {})
142 #checkRights($response)
143 #if("$!response.get('status')" != 'fail')
144 #set($obj = $doc.newObject('XWiki.XWikiSkinFileOverrideClass'))
145 #set($discard = $obj.set('path', $request.path))
146 #set($discard = $doc.save('Add a new XWiki.XWikiSkinFileOverrideClass object'))
147 #set($discard = $response.put('objNumber', $obj.number))
148 #set($discard = $response.put('status', 'success'))
149 #end
150 $jsontool.serialize($response)
151 #end
152 ###########################
153 ## DELETE OBJ
154 ###########################
155 #macro(deleteObj)
156 #set($response = {})
157 #checkRights($response)
158 #if("$!response.get('status')" != 'fail')
159 #set($objNumber = $numbertool.toNumber($request.objNumber).intValue())
160 #set($obj = $doc.getObject('XWiki.XWikiSkinFileOverrideClass', $objNumber))
161 #set($discard = $doc.removeObject($obj))
162 #set($saveMessage = "Remove the object XWiki.XWikiSkinFileOverrideClass[" + $obj.getValue('path') + "]")
163 #set($discard = $doc.save($saveMessage))
164 #set($discard = $response.put('status', 'success'))
165 #end
166 $jsontool.serialize($response)
167 #end
168 {{/velocity}}
169