Skip to content

Instantly share code, notes, and snippets.

@inhji
Created April 12, 2013 09:40
Show Gist options
  • Save inhji/5370866 to your computer and use it in GitHub Desktop.
Save inhji/5370866 to your computer and use it in GitHub Desktop.
XWiki Tagging
#template("xwikivars.vm")
#set($tagsId = 'xdocTags')
#set($tagErrorMessage = '')
#set($xredirect = $escapetool.url($doc.getURL('view', "#${tagsId}")))
#set($predefinedTags = ['Windows','Linux','Oracle'])
##
##
##
#macro(displayTag $tag)
<span class="tag-wrapper"><span class="tag"><a href="$xwiki.getURL('Main.Tags', 'view', "do=viewTag&amp;tag=$!{escapetool.url($tag)}")">$!{escapetool.xml($tag)}</a></span>#if($xwiki.hasAdminRights())<span class="separator">[</span><a href="$doc.getURL('view', "xpage=documentTags&amp;xaction=delete&amp;tag=$!{escapetool.url($tag)}&amp;xredirect=${xredirect}")" class="tag-tool tag-delete" title="$msg.get('core.tags.remove.tooltip')">X</a><span class="separator">]</span>#end</span>
#end
#macro(displayTagDisabled $tag)
## #if($xwiki.hasAdminRights())
<span class="tag-wrapper"><span class="tag" style="text-decoration: line-through;"><a href="$xwiki.getURL('Main.Tags', 'view', "do=viewTag&amp;tag=$!{escapetool.url($tag)}")">$!{escapetool.xml($tag)}</a></span>#if($hasedit)<span class="separator">[</span><a href="$doc.getURL('view', "xpage=documentTags&amp;xaction=delete&amp;tag=$!{escapetool.url($tag)}&amp;xredirect=${xredirect}")" class="tag-tool tag-delete" title="$msg.get('core.tags.remove.tooltip')">X</a><span class="separator">]</span>#end</span>
## #end
#end
##
#macro(removeTag $tag)
#if($xwiki.tag)
#set($result = $xwiki.tag.removeTagFromDocument($tag, $doc.fullName))
#if($result == 'OK' && "$!{request.ajax}" != '')
$response.setStatus(200)
#set($responseMessage = 'OK')
#elseif($result == 'NO_EFFECT')
$response.setStatus(409)
#set($responseMessage = $msg.get('core.tags.remove.error.notFound', [$tag]))
#elseif($result == 'NOT_ALLOWED')
$response.setStatus(403)
#set($responseMessage = $msg.get('core.tags.remove.error.notAllowed', [$tag]))
#elseif($result == 'FAILED')
$response.setStatus(500)
#set($responseMessage = $msg.get('core.tags.remove.error.failed', [$tag]))
#end
#if("$!{request.ajax}" != '')
$!responseMessage
#elseif("$!{request.xredirect}" != '')
$response.sendRedirect($request.xredirect)
#end
#else
## TODO
#end
#end
##
#macro(addTag $tag)
#if($xwiki.tag)
#set($oldTags = $xwiki.tag.getTagsFromDocument($doc.fullName))
#set($result = $xwiki.tag.addTagsToDocument($tag, $doc.fullName))
#if($result == 'OK' && "$!{request.ajax}" != '')
#set($newTags = $xwiki.tag.getTagsFromDocument($doc.fullName))
#set($discard = $newTags.removeAll($oldTags))
#foreach($t in $newTags)
#if($t != '' && !$oldTags.contains($t))
#displayTag($t)
#end
#end
#elseif($result == 'NO_EFFECT')
$response.setStatus(409)
#set($tagErrorMessage = $msg.get('core.tags.add.error.alreadySet', [$tag]))
#elseif($result == 'NOT_ALLOWED')
$response.setStatus(403)
#set($tagErrorMessage = $msg.get('core.tags.add.error.notAllowed', [$tag]))
#elseif($result == 'FAILED')
$response.setStatus(500)
#set($tagErrorMessage = $msg.get('core.tags.add.error.failed', [$tag]))
#end
#if("$!{request.ajax}" != '')
$tagErrorMessage
#elseif("$!{request.xredirect}" != '')
$response.sendRedirect($request.xredirect)
#end
#else
## TODO
#end
#end
##
#macro(displayAddForm)
#if($xwiki.hasAdminRights())
<form action="$doc.getURL('view', "xpage=documentTags&amp;xaction=add&amp;xredirect=${xredirect}")" method="post" class="tag-add-form">
<div>
## CSRF prevention
<div class="hidden"><input type="hidden" name="form_token" value="$!{services.csrf.getToken()}" /></div>
<label for="tag">$msg.get('core.tags.add.label')<br/>
<input class="input-tag" type="text" id="tag" name="tag" autocomplete="off"/></label><br/>
<span class="buttonwrapper"><input class="button button-add-tag" type="submit" value="$msg.get('core.tags.add.submit')"/></span>
<span class="buttonwrapper"><a class="button button-add-tag-cancel" href="$doc.getURL('view', "#${tagsId}")">$msg.get('core.tags.add.cancel')</a></span>
</div>
</form>
#end
#end
##
#set($xaction = "$!{request.xaction}")
#if("$!{request.showTagAddForm}" == 'true' && "$!{request.ajax}" == '1')
#displayAddForm()
#elseif($xaction == 'delete')
#removeTag($request.tag)
#elseif($xaction == 'add')
#addTag($request.tag)
#else ## display
$xwiki.ssfx.use('uicomponents/viewers/tags.css', {'forceSkinAction': true, 'colorTheme': "$!{themeDocFullName}"})##
$xwiki.jsfx.use('uicomponents/viewers/tags.js', true)##
<div class="doc-tags" id="${tagsId}">
#if($xwiki.tag)
#set($hasTagsPlugin = true)
#set($tags = $xwiki.tag.getTagsFromDocument($doc.fullName))
#else
#set($hasTagsPlugin = false)
#set($tags = $doc.getTagList())
#end
## #if($!tags.size() == 0)
## No tags
## #else
$msg.get('core.tags.list.label')
#foreach($tag in $tags)
#if($predefinedTags.contains($tag))
#displayTag($tag)
#else
#displayTagDisabled($tag)
#end
#end
## #end
#if($hasedit)
#if($xwiki.tag)
<div class="tag-tool tag-add">#if("$!{request.showTagAddForm}" == '')<a href="$doc.getURL('view', "showTagAddForm=true&amp;$!{escapetool.url(${request.queryString})}#${tagsId}")" title="$msg.get('core.tags.add.tooltip')">[+]</a>#else #displayAddForm()#end</div>
#else
## TODO
#end
#end
</div>
#if($tagErrorMessage != '')
#error($tagErrorMessage)
#end
#end
#set($sql = ", BaseObject as obj where obj.name = doc.fullName and obj.className = 'TagList.TagsClass' and obj.name <> 'TagList.TagsTemplate'")
#set($results = $xwiki.searchDocuments($sql))
#set($predefinedTags = [])
#if(!$results.empty)
#foreach ($item in $results)
#set($tag = $xwiki.getDocument($item))
#set($obj = $tag.getObject("TagList.TagsClass"))
#set($prop = $obj.get("tag"))
#set($foo = $predefinedTags.add($prop))
#end
#end
{{velocity}}
#if("$!request.docName" != '')
## Request for creating a new instance
#set($docName = $util.clearName(${request.docName}))
#set($targetDocName = "${request.spaceName}.${docName}")
#if(!$xwiki.exists($targetDocName) && $xwiki.hasAccessLevel('edit', $context.user, $targetDocName))
##Testing creating a document programatically
#set($newDoc = $xwiki.getDocument($targetDocName))
##Set a title
$newDoc.setTitle("{$docName}")
##Not necessary but good to know
$newDoc.setParent("${targetDocName}.WebHome")
##This is how you can use a template
$newDoc.setContent('{{include document="TagList.TagsSheet"/}}')
##Create a new object on the document
#set($newObj = $newDoc.newObject("TagList.TagsClass"))
##Set a field to a particular value
$newObj.set("tag", $docName)
$newDoc.save()
{{info}}Tag wurde erstellt{{/info}}
#elseif ("$!targetDocName" != '' && $xwiki.exists($targetDocName))
{{warning}}Dieser Tag existiert bereits [[hier>>$targetDocName]]{{/warning}}
#elseif ("$!targetDocName" != '')
{{warning}}Sie haben nicht die nötigen Berechtigungen, um diese Aktion auszuführen{{/warning}}
#end
#end
= Neuen Tag hinzufügen =
{{html}}
<form action="" id="newdoc" method="post">
<div>
<input type="hidden" name="parent" value="${doc.fullName}"/>
<input type="hidden" name="template" value="TagList.TagsTemplate"/>
<input type="hidden" name="sheet" value="1"/>
<input type="hidden" name="spaceName" value="TagList"/>
Tag: <input type="text" name="docName" value="Neuer Tag" class="withTip" size="50"/>
<span class="buttonwrapper"><input type="submit" value="Tag Erstellen" class="button"/></span>
</div>
</form>
{{/html}}
#set($columns = ["tag", "doc.creationDate", "_actions"])
#set($columnsProperties = {
"tag" : { "type" : "text", "link" : "view", "html" : "true", "sortable":true },
"_actions" : {"actions": ["edit","delete"]}
})
#set($options = {
"className":"TagList.TagsClass",
"translationPrefix" : "tag.",
"tagCloud" : true,
"rowCount": 10
})
#livetable("tags" $columns $columnsProperties $options)
{{/velocity}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment