General Actions:
Log-in
Register
Wiki:
Main wiki
▼
:
Document Index
»
Space:
WorkspaceManager
▼
:
Document Index
»
Page:
BrowseWorkspacesLiveTableResultsMacros
Search
en
Page Actions:
Export
▼
:
Export as PDF
Export as RTF
Export as HTML
More actions
▼
:
Print preview
View Source
Main wiki
»
Browse Workspaces
»
platform.livetable.resultsmacros
Wiki source code of
platform.livetable.resultsmacros
Last modified by
Administrator
on 2012/03/21 17:40
Content
·
Comments
(0)
·
Annotations
(0)
·
Attachments
(0)
·
History
·
Information
Hide line numbers
1: {{velocity output="false"}} 2: #** 3: * Macro to get the results of a livetable data call. 4: * This page is called from live grids via Ajax with the argument xpage=plain. It returns a 5: * set of results serialized in JSON. 6: *# 7: #macro(gridresult $className $collist) 8: #gridresultwithfilter($className $collist '' '' []) 9: #end 10: 11: 12: 13: #** 14: * Macro to get the results of a livetable data call. 15: * This page is called from live grids via Ajax with the argument xpage=plain. It returns a 16: * set of results serialized in JSON. 17: *# 18: #macro(gridresultwithfilter $className $collist $filterfrom $filterwhere $filterParams) 19: #if("$!{request.xpage}" == 'plain') 20: $response.setContentType('application/json') 21: #end 22: #set($offset = $util.parseInt($request.get('offset'))) 23: ## offset starts from 0 in velocity and 1 in javascript 24: #set($offset = $offset - 1) 25: #if($offset < 0) 26: #set($offset = 0) 27: #end 28: #set($limit = $util.parseInt($request.get('limit'))) 29: #set($tablelist = $util.arrayList) 30: ## 31: ## 32: ## 33: ## Compute the query to use for retrieving data 34: ## 35: ## 36: ## additional columns, should *not* contain parameters, all added column names must be filtered 37: #set($fromSql = '') 38: ## parametrized filter part of the query 39: #set($whereSql = '') 40: ## list of parameters to use with $whereSql 41: #set($whereParams = []) 42: #set($class = $xwiki.getDocument($className).getxWikiClass()) 43: ## 44: ## Add the columns needed for the actual data 45: ## 46: #foreach($colname in $collist) 47: #livetable_addColumnToQuery($colname) 48: #end 49: ## 50: ## Tag filtering 51: ## 52: #if($request.tag) 53: #set($fromSql = "${fromSql} , BaseObject as tobject, DBStringListProperty as tagprop") 54: #set($whereSql = "${whereSql} and tobject.className='XWiki.TagClass' and tobject.name=doc.fullName and tobject.id=tagprop.id.id and tagprop.id.name='tags' and (") 55: #foreach($tag in $request.getParameterValues('tag')) 56: #set($tag = $util.decodeURI($tag)) 57: #if($velocityCount > 1) #set($whereSql = "${whereSql} and ") #end 58: #set($whereSql = "${whereSql} ? in elements(tagprop.list)") 59: #set($discard = $whereParams.add("${tag}")) 60: #end 61: #set($whereSql = "${whereSql})") 62: #end 63: ## 64: ## 65: ## Order 66: ## 67: #set($order = "$!request.sort") 68: #if($order != '') 69: #set($orderDirection = "$!{request.get('dir').toLowerCase()}") 70: #if("$!orderDirection" != '' && "$!orderDirection" != 'asc') 71: #set($orderDirection = 'desc') 72: #end 73: #if($order == 'description') 74: #set($tableAlias = 'dtable') 75: #else 76: #set($tableAlias = $order) 77: #end 78: ## only safe version should be used in SQL queries 79: #set($safe_tableAlias = "$!{tableAlias.replaceAll('[^a-zA-Z0-9_.]','')}") 80: ## 81: #if($order.startsWith('doc.')) 82: #set($orderSql = " order by ${safe_tableAlias.replace('_','.')} ${orderDirection}") 83: #elseif($tablelist.contains($tableAlias)) 84: #set($orderSql = " order by ${safe_tableAlias}.value ${orderDirection}") 85: #elseif($order == 'averagevote') 86: #livetable_getTableName($order) 87: #set($fromSql = "${fromSql}, BaseObject as objratings, ${tableName} ${safe_tableAlias}") 88: #set($whereSql = "${whereSql} and doc.fullName=objratings.name and objratings.className='XWiki.AverageRatingsClass' and objratings.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.name = ?") 89: #set($discard = $whereParams.add("${order}")) 90: #set($orderSql = " order by ${safe_tableAlias}.value ${orderDirection}") 91: #else 92: #set($multiselect = $class.get($order).getProperty('multiSelect').getValue()) 93: #if("$multiselect" != '1') 94: #livetable_getTableName($order) 95: #set($fromSql = "${fromSql}, ${tableName} ${safe_tableAlias}") 96: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.name = ?") 97: #set($discard = $whereParams.add("${order}")) 98: #set($orderSql = " order by ${safe_tableAlias}.value ${orderDirection}") 99: #end 100: #end 101: #end 102: ## 103: ## 104: ## Compute the final queries 105: ## 106: #set($sqlParams = []) 107: #set($tagsMatchingParams = []) 108: #set($allMatchingParams = []) 109: #if("$!className" != '') 110: ## Class query 111: #set($countSql = ", BaseObject as obj $!fromSql $!filterfrom where obj.name=doc.fullName and obj.className = ? and doc.fullName not in (?, ?) $!whereSql $!filterwhere") 112: #set($discard = $sqlParams.addAll(["${className}", "${className}Template", ${className.replaceAll('Class$', 'Template')}])) 113: #set($discard = $sqlParams.addAll($whereParams)) 114: ## 115: #set($tagsMatchingFiltersFrom = ", BaseObject as obj $!fromSql $!filterfrom") 116: #set($tagsMatchingFiltersWhere = "obj.name=doc.fullName and obj.className = ? and doc.fullName not in (?, ?) $!whereSql $!filterwhere") 117: #set($discard = $tagsMatchingParams.addAll(["${className}", "${className}Template", ${className.replaceAll('Class$', 'Template')}])) 118: #set($discard = $tagsMatchingParams.addAll($whereParams)) 119: ## 120: #set($allMatchingTagsFrom = ", BaseObject as obj $!filterfrom") 121: #set($allMatchingTagsWhere = "obj.name=doc.fullName and obj.className = ? and doc.fullName not in (?, ?) $!filterwhere") 122: #set($discard = $allMatchingParams.addAll(["${className}", "${className}Template", ${className.replaceAll('Class$', 'Template')}])) 123: ## 124: #if($filterParams) 125: #set($discard = $sqlParams.addAll($filterParams)) 126: #set($discard = $tagsMatchingParams.addAll($filterParams)) 127: #set($discard = $allMatchingParams.addAll($filterParams)) 128: #end 129: #else 130: ## Document query 131: #set($countSql = "$!fromSql $!filterfrom where 1=1 $!whereSql $!filterwhere") 132: #set($discard = $sqlParams.addAll($whereParams)) 133: ## 134: #set($tagsMatchingFiltersFrom = "$!fromSql $!filterfrom") 135: #set($tagsMatchingFiltersWhere = "1=1 $!whereSql $!filterwhere") 136: #set($discard = $tagsMatchingParams.addAll($whereParams)) 137: ## 138: #set($allMatchingTagsFrom = "$!filterfrom") 139: #set($allMatchingTagsWhere = "1=1 $!filterwhere") 140: ## 141: #if($filterParams) 142: #set($discard = $sqlParams.addAll($filterParams)) 143: #set($discard = $tagsMatchingParams.addAll($filterParams)) 144: #set($discard = $allMatchingParams.addAll($filterParams)) 145: #end 146: #end 147: ## 148: ## TagCloud matching the current filters 149: #set($tagsMatchingFilters = $xwiki.tag.getTagCountForQuery($tagsMatchingFiltersFrom, $tagsMatchingFiltersWhere, $tagsMatchingParams)) 150: ## TagCloud matching all the documents used by the livetable 151: #set($allMatchingTags = $xwiki.tag.getTagCountForQuery($allMatchingTagsFrom, $allMatchingTagsWhere, $allMatchingParams)) 152: #set($countSql = ", BaseObject as workspaceObject $countSql and workspaceObject.name=doc.fullName and workspaceObject.className='WorkspaceManager.WorkspaceClass'") 153: #set($sql = "$countSql $!{orderSql}") 154: #set($items = $xwiki.searchDocuments($sql, $limit, $offset, $sqlParams)) 155: #set($totalItems = $xwiki.countDocuments($countSql, $sqlParams)) 156: #set($returnedItems = $items.size()) 157: ## 158: ## 159: ## ============================================== 160: ## json starts 161: ## ============================================== 162: { 163: #if("$!request.sql" == '1') 164: "sql": "$escapetool.javascript($sql)", 165: "countsql": "$escapetool.javascript($countSql)", 166: "params": "$escapetool.javascript($sqlParams)" 167: #end 168: "totalrows": $totalItems, 169: "matchingtags": { 170: #foreach($tag in $tagsMatchingFilters.keySet()) 171: #if($velocityCount > 1) , #end 172: "$escapetool.javascript($tag)": {} 173: #end 174: }, 175: "tags" : [ 176: #foreach($tag in $allMatchingTags.keySet()) 177: #if($velocityCount > 1) , #end 178: {"tag": "$escapetool.javascript($tag)", "count": $allMatchingTags.get($tag)} 179: #end 180: ], 181: "returnedrows": #if($returnedItems < $limit) $returnedItems #else $limit #end, 182: "offset": $mathtool.add($offset, 1), 183: "reqNo": $util.parseInt($request.reqNo), 184: "rows": [ 185: ## Some constants which are usefull while processing each item. 186: #set ($WorkspaceManager = $services.workspace) 187: #set ($currentUser = "${xcontext.mainWikiName}:${xcontext.user}") 188: #set ($deleteWorkspaceDocumentReference = $services.model.createDocumentReference($xcontext.database, 'WorkspaceManager', 'DeleteWorkspaceCode')) 189: #set ($joinWorkspaceDocumentReference = $services.model.createDocumentReference($xcontext.database, 'WorkspaceManager', 'JoinWorkspaceCode')) 190: #set ($leaveWorkspaceDocumentReference = $services.model.createDocumentReference($xcontext.database, 'WorkspaceManager', 'LeaveWorkspaceCode')) 191: #foreach($item in $items) 192: #set($viewable = $xwiki.hasAccessLevel('view', $context.user, "${context.database}:${item}")) 193: #if($velocityCount > 1) , #end 194: { 195: "doc_viewable" : $viewable, 196: #if(!$viewable) 197: "doc_fullname" : "$escapetool.javascript(${context.database}):$escapetool.javascript(${item})" 198: #else 199: #set($itemDoc = $xwiki.getDocument($item)) 200: #set($fullname = "${itemDoc.wiki}:${itemDoc.space}.${itemDoc.name}") 201: #set($discard = $itemDoc.use($className)) 202: #set ($itemWikiDocument = $services.wikimanager.getWikiFromDocumentName($itemDoc.fullName)) 203: #set ($itemWikiDescriptor = $itemWikiDocument.firstWikiAlias) 204: #set ($itemWikiName = $itemWikiDescriptor.wikiName) 205: #set ($workspace = $WorkspaceManager.getWorkspace($itemWikiName)) 206: #set($itemUrl = $xwiki.getURL($item)) 207: #set($spaceUrl = $xwiki.getURL("${itemDoc.wiki}:${itemDoc.space}.WebHome")) 208: #if($xwiki.isVirtualMode()) 209: #set($wiki = $itemDoc.wiki) 210: #set($wikiUrl = $xwiki.getURL("${itemDoc.wiki}:Main.WebHome")) 211: #end 212: #set($editUrl = $itemDoc.getURL($itemDoc.defaultEditMode)) 213: #set($copyUrl = $itemDoc.getURL('view', 'xpage=copy')) 214: #set ($deleteUrl = $xwiki.getURL($deleteWorkspaceDocumentReference, 'view', "workspaceId=${itemWikiName}&workspaceName=${itemWikiDescriptor.wikiPrettyName}")) 215: #set($renameUrl = $itemDoc.getURL('view', 'xpage=rename&step=1')) 216: #set($rightsUrl = $itemDoc.getURL('edit', 'editor=rights')) 217: ## 218: ## Init membership actions as denied. 219: #set ($itemHasJoin = false) 220: #set ($itemHasRequestJoin = false) 221: #set ($itemHasCancelJoinRequest = false) 222: #set ($itemHasViewInvitation = false) 223: #set ($itemHasLeave = false) 224: ## Determine if current user is already a member. 225: #set ($itemGroupDocument = $workspace.groupDocument) 226: #set ($itemGroupsClass = "${itemWikiName}:XWiki.XWikiGroups") 227: #set ($currentUserGroupObject = $itemGroupDocument.getObject($itemGroupsClass, 'member', $currentUser)) 228: #set ($currentUserIsMember = !("$!currentUserGroupObject" == '')) 229: ## Determine available membership action and action URL. 230: #if ($currentUserIsMember) 231: ## Don`t allow the owner to leave the workspace. 232: #if ($itemWikiDescriptor.owner != $currentUser) 233: #set ($itemHasLeave = true) 234: #set ($leaveUrl = $xwiki.getURL($leaveWorkspaceDocumentReference, 'view', "workspaceId=${itemWikiName}&workspaceName=${itemWikiDescriptor.wikiPrettyName}")) 235: #end 236: #else 237: ## 238: ## Determine if, regardless of membership type, an existing invitation exists for the current user. 239: #set ($candidateMembers = $itemGroupDocument.getObjects('XWiki.WorkspaceCandidateMemberClass', 'userName', $currentUser)) 240: #set ($existingInvitation = false) 241: #foreach ($candidateMember in $candidateMembers) 242: ## Use getProperty because it's an api Object. 243: #if ("$!{candidateMember.getProperty('type').getValue()}" == 'invitation' && 244: "$!{candidateMember.getProperty('status').getValue()}" == 'pending') 245: ## Remember the existing invitation. 246: #set ($existingInvitation = $candidateMember) 247: #end 248: #end 249: #set ($itemMembershipType = $itemDoc.getObject('WorkspaceManager.WorkspaceClass').getProperty('membershipType').getValue()) 250: #if ($existingInvitation) 251: #set ($itemHasViewInvitation = true) 252: #set ($viewInvitationUrl = $xwiki.getURL($joinWorkspaceDocumentReference, 'view', "workspaceId=${itemWikiName}")) 253: #elseif ($itemMembershipType == 'open') 254: #set ($itemHasJoin = true) 255: #set ($joinUrl = $xwiki.getURL($joinWorkspaceDocumentReference, 'view', "workspaceId=${itemWikiName}")) 256: #elseif ($itemMembershipType == 'request') 257: ## Determine if a request was already sent. 258: #set ($pendingRequest = false) 259: #set ($existingRequests = $itemGroupDocument.getObjects('XWiki.WorkspaceCandidateMemberClass', 'userName', $currentUser)) 260: #foreach ($existingRequest in $existingRequests) 261: ## Use getProperty because it's an api Object. 262: #if ("$!{existingRequest.getProperty('type').getValue()}" == 'request' && 263: "$!{existingRequest.getProperty('status').getValue()}" == 'pending') 264: #set ($pendingRequest = true) 265: #end 266: #end 267: #if ($pendingRequest) 268: #set ($itemHasCancelJoinRequest = true) 269: #set ($cancelJoinRequestUrl = $xwiki.getURL($joinWorkspaceDocumentReference, 'view', "workspaceId=${itemWikiName}&cancelJoinRequest=1")) 270: #else 271: #set ($itemHasRequestJoin = true) 272: #set ($requestJoinUrl = $xwiki.getURL($joinWorkspaceDocumentReference, 'view', "workspaceId=${itemWikiName}&requestJoin=1")) 273: #end 274: #end 275: #end 276: "doc_name" : "$escapetool.javascript($itemDoc.name)", 277: "doc_fullname" : "$escapetool.javascript($fullname)", 278: "doc_space" : "$escapetool.javascript(${itemDoc.space})", 279: "doc_url" : "$escapetool.javascript(${itemUrl})", 280: "doc_space_url" : "$escapetool.javascript(${spaceUrl})", 281: #if($xwiki.isVirtualMode()) 282: "doc_wiki" : "$escapetool.javascript($wiki)", 283: "doc_wiki_url" : "$escapetool.javascript($wikiUrl)", 284: #end 285: ## If actions are not explicitly set to false, they will show up in the livetable. 286: "doc_hasadmin" : $xwiki.hasAdminRights(), 287: "doc_hasedit" : $xwiki.hasAccessLevel('edit', $context.user, $fullname), 288: "doc_hasdelete" : $WorkspaceManager.canDeleteWorkspace($currentUser, $itemWikiName), 289: "doc_hasjoin" : $itemHasJoin, 290: "doc_hasrequestJoin" : $itemHasRequestJoin, 291: "doc_hasviewInvitation" : $itemHasViewInvitation, 292: "doc_hascancelJoinRequest" : $itemHasCancelJoinRequest, 293: "doc_hasleave" : $itemHasLeave, 294: "doc_edit_url" : "$escapetool.javascript($editUrl)", 295: "doc_copy_url" : "$escapetool.javascript($copyUrl)", 296: "doc_delete_url" : "$escapetool.javascript($deleteUrl)", 297: "doc_rename_url" : "$escapetool.javascript($renameUrl)", 298: "doc_rights_url" : "$escapetool.javascript($rightsUrl)", 299: #if ($itemHasJoin) 300: "doc_join_url" : "$escapetool.javascript($joinUrl)", 301: #elseif ($itemHasLeave) 302: "doc_leave_url" : "$escapetool.javascript($leaveUrl)", 303: #elseif ($itemHasRequestJoin) 304: "doc_requestJoin_url" : "$escapetool.javascript($requestJoinUrl)", 305: #elseif ($itemHasViewInvitation) 306: "doc_viewInvitation_url" : "$escapetool.javascript($viewInvitationUrl)", 307: #elseif ($itemHasCancelJoinRequest) 308: "doc_cancelJoinRequest_url" : "$escapetool.javascript($cancelJoinRequestUrl)", 309: #end 310: "doc_author_url" : "$escapetool.javascript($xwiki.getURL($itemDoc.author))", 311: "doc_date" : "$escapetool.javascript(${xwiki.formatDate($itemDoc.date)})", 312: "doc_title" : "$escapetool.javascript($escapetool.xml(${itemDoc.plainTitle}))", 313: "doc_author" : "$escapetool.javascript(${xwiki.getLocalUserName($itemDoc.author, false)})", 314: "doc_creationDate" : "$escapetool.javascript(${xwiki.formatDate($itemDoc.creationDate)})", 315: "doc_creator" : "$escapetool.javascript(${xwiki.getLocalUserName($itemDoc.creator, false)})" 316: #foreach($colname in $collist) 317: #if($colname.startsWith('doc.')) 318: #elseif($colname == '_action') , 319: #set($text = $msg.get("${request.transprefix}actiontext")) 320: "$escapetool.javascript(${colname})" : "$escapetool.javascript(${text})" 321: #elseif($colname == '_attachments') , 322: #livetable_getAttachmentsList($itemDoc) 323: "$escapetool.javascript(${colname})" : "$escapetool.javascript(${attachlist})" 324: #elseif($colname == '_avatar') , 325: #livetable_getAvatar($itemDoc) 326: "$escapetool.javascript(${colname})" : "$escapetool.javascript(${avatar})" 327: #elseif($colname == '_images') , 328: #livetable_getImagesList($itemDoc) 329: "$escapetool.javascript(${colname})" : "$escapetool.javascript(${imagesList})" 330: #else , 331: #set($propClassName = "$!{request.get(${colname.concat('_class')})}") 332: #if($propClassName != '') 333: #set($propClass = $xwiki.getDocument($propClassName).getxWikiClass()) 334: #set($discard = $itemDoc.use($propClassName)) 335: #else 336: #set($propClass = $class) 337: #end 338: ## Retrieve the property type as it might be usefull 339: #set($propType = '') 340: #if($listtool.contains($propClass.getPropertyNames(), $colname)) 341: #set($propType = "$!{propClass.get($colname).type}") 342: #end 343: #set($fieldValue = "$!itemDoc.getValue($colname)") 344: #set($fieldDisplayValue = "$!itemDoc.display($colname, 'view')") 345: #if($fieldDisplayValue == '') 346: #set($fieldDisplayValue = $msg.get("${request.transprefix}emptyvalue")) 347: #end 348: #set($fieldUrl = '') 349: ## only retrieve an URL for a DBListClass item 350: #if($propType == 'DBListClass') 351: #set($fieldUrl = $xwiki.getDocument($fieldValue).getURL()) 352: #if($fieldUrl == $xwiki.getURL('Main.WebHome')) 353: #set($fieldUrl = '') 354: #end 355: #end 356: #if($fieldUrl == '') 357: #if ($colname == 'wikiprettyname') 358: #set ($fieldUrl = $itemWikiDescriptor.homePageUrl) 359: #elseif ($colname == 'owner') 360: #set ($userDocument = $xwiki.getDocument($fieldValue)) 361: #set ($fieldUrl = $userDocument.URL) 362: ## Override display value with first_name last_name 363: #set ($fieldDisplayValue = "${userDocument.first_name} ${userDocument.last_name}") 364: #end 365: #end 366: "$escapetool.javascript(${colname})" : "$escapetool.javascript($fieldDisplayValue.replaceFirst($regextool.quote('{{html clean="false" wiki="false"}}'), '').replaceAll("$regextool.quote('{{/html}}')$", ''))", 367: "$escapetool.javascript(${colname})_value" : "$escapetool.javascript(${fieldValue})", 368: "$escapetool.javascript(${colname})_url" : "$escapetool.javascript(${fieldUrl})" 369: ## reset to the default class 370: #set($discard = $itemDoc.use($className)) 371: #end 372: #end 373: #end 374: } 375: #end 376: ]} 377: ## ============================================== 378: ## json ended 379: ## ============================================== 380: #end 381: 382: 383: #** 384: * Get the name of the Property that should be used for a given livetable column. 385: * NOTE the resulting $tableName is safe to use inside SQL queries 386: *# 387: #macro(livetable_getTableName $colname) 388: #set($propClassName = "$!request.get(${colname.concat('_class')})") 389: #if($propClassName != '') 390: #set($propClass = $xwiki.getDocument($propClassName).getxWikiClass()) 391: #else 392: #set($propClass = $class) 393: #end 394: #set($propType = '') 395: #if($listtool.contains($propClass.getPropertyNames(), $colname)) 396: #set($propType = "$!{propClass.get($colname).type}") 397: #end 398: #if($propType == 'NumberClass') 399: #set($numberType = $propClass.get($colname).getProperty('numberType').getValue()) 400: #if($numberType == 'integer') 401: #set($tableName = 'IntegerProperty') 402: #elseif($numberType == 'float') 403: #set($tableName = 'FloatProperty') 404: #elseif($numberType == 'double') 405: #set($tableName = 'DoubleProperty') 406: #else 407: #set($tableName = 'LongProperty') 408: #end 409: #elseif($propType == 'BooleanClass') 410: #set($tableName = 'IntegerProperty') 411: #elseif($propType == 'DateClass') 412: #set($tableName = 'DateProperty') 413: #elseif($propType == 'TextAreaClass' || $propType == 'UsersClass' || $propType == 'GroupsClass') 414: #set($tableName = 'LargeStringProperty') 415: #elseif($propType == 'StaticListClass' || $propType == 'DBListClass' || $propType == 'DBTreeListClass') 416: #set($multiSelect = $propClass.get($colname).getProperty('multiSelect').getValue()) 417: #set($relationalStorage = $propClass.get($colname).getProperty('relationalStorage').getValue()) 418: #if($multiSelect == 1) 419: #if($relationalStorage == 1) 420: #set($tableName = 'DBStringListProperty') 421: #else 422: #set($tableName = 'StringListProperty') 423: #end 424: #else 425: #set($tableName = 'StringProperty') 426: #end 427: #else 428: #set($tableName = 'StringProperty') 429: #end 430: #end 431: 432: #** 433: * Old alias of the #livetable_getTableName macro. 434: * @deprecated since 2.2.3, use {@link #livetable_getTableName} 435: *# 436: #macro(grid_gettablename $colname) 437: #livetable_getTableName($colname) 438: #end 439: 440: 441: 442: #** 443: * List attachments for a document, putting the result as HTML markup in the $attachlist variable. 444: *# 445: #macro(livetable_getAttachmentsList $itemDoc) 446: #set($attachlist = '') 447: #foreach($attachment in $itemDoc.attachmentList) 448: #set($attachmentUrl = $itemDoc.getAttachmentURL($attachment.filename)) 449: #set($attachlist = "${attachlist}<a href='${attachmentUrl}'>$attachment.filename</a><br/>") 450: #end 451: #end 452: 453: #** 454: * Old alias of the #livetable_getAttachmentsList macro. 455: * @deprecated since 2.2.3, use {@link #livetable_getAttachmentsList} 456: *# 457: #macro(grid_attachlist $itemDoc) 458: #livetable_getAttachmentsList($itemDoc) 459: #end 460: 461: 462: 463: #** 464: * List image attachments for a document, putting the result as HTML markup in the $imagesList variable. 465: *# 466: #macro(livetable_getImagesList $itemDoc) 467: #set($imagesList = '') 468: #foreach ($attachment in $itemDoc.attachmentList) 469: #if($attachment.isImage()) 470: #set($attachmentUrl = $itemDoc.getAttachmentURL($attachment.filename)) 471: #set($imagesList = "${imagesList}<img src='${attachmentUrl}' alt='${attachment.filename}' width='50'/><br/>") 472: #end 473: #end 474: #end 475: 476: #** 477: * Old alias of the #livetable_getImagesList macro. 478: * @deprecated since 2.2.3, use {@link #livetable_getImagesList} 479: *# 480: #macro(grid_photolist $itemDoc) 481: #livetable_getImagesList($itemDoc) 482: #end 483: 484: 485: #** 486: * Generate the HTML code for a user avatar, with a fixed 50px width. 487: *# 488: #macro(livetable_getAvatar $itemDoc) 489: #set ($avatar = "#mediumUserAvatar($itemDoc.fullName)") 490: #set ($avatar = $avatar.trim()) 491: #end 492: 493: #** 494: * Old alias of the #livetable_getAvatar macro. 495: * @deprecated since 2.2.3, use {@link #livetable_getAvatar} 496: *# 497: #macro(grid_avatar $itemDoc) 498: #livetable_getAvatar($itemDoc) 499: #end 500: 501: 502: 503: #** 504: * Macro to extend the query to select the properties for the livetable columns. 505: * NOTE $colname is filtered (all characters but [a-zA-Z0-9_.] are removed) before use 506: *# 507: #macro(livetable_addColumnToQuery $colname) 508: #set($filterValue = "$!{request.get($colname)}") 509: #if($colname == 'description') 510: #set($tableAlias = 'dtable') 511: #else 512: #set($tableAlias = $colname) 513: #end 514: ## only safe versions should be used in SQL queries 515: #set($safe_colname = "$!{colname.replaceAll('[^a-zA-Z0-9_.]','')}") 516: #set($safe_tableAlias = "$!{tableAlias.replaceAll('[^a-zA-Z0-9_.]','')}") 517: ## 518: #set($propType = '') 519: #set($propClassName = "$!request.get(${colname.concat('_class')})") 520: #if($propClassName != '') 521: #set($propClass = $xwiki.getDocument($propClassName).getxWikiClass()) 522: #else 523: #set($propClass = $class) 524: #end 525: #if($propClass && $listtool.contains($propClass.getPropertyNames(), $colname)) 526: #set($propType = "$!{propClass.get($colname).type}") 527: #end 528: ## 529: ## Filter values 530: #if("$!filterValue" != '') 531: #set($discard = $tablelist.add($tableAlias)) 532: #if($colname.startsWith('doc.')) 533: #set($whereSql = "${whereSql} and upper(str(${safe_colname.replace('_','.')})) like upper(?)") 534: #set($discard = $whereParams.add("%${filterValue}%")) 535: #elseif($propType == 'NumberClass' || $propType == 'BooleanClass') 536: #livetable_getTableName($colname) 537: #set($fromSql = "${fromSql}, ${tableName} ${safe_tableAlias}") 538: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and ${safe_tableAlias}.value = ?") 539: #set($discard = $whereParams.addAll(["${colname}", $util.parseInt(${filterValue})])) 540: #elseif($propType == 'DateClass') 541: #set($fromSql = "${fromSql}, DateProperty ${safe_tableAlias}") 542: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and upper(str(${safe_tableAlias}.value)) like upper(?)") 543: #set($discard = $whereParams.addAll(["${colname}", "%${filterValue}%"])) 544: #elseif($propType == 'TextAreaClass' || $propType == 'UsersClass' || $propType == 'GroupsClass') 545: #set($fromSql = "${fromSql}, LargeStringProperty ${safe_tableAlias}") 546: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and upper(${safe_tableAlias}.value) like upper(?)") 547: #set($discard = $whereParams.addAll(["${colname}", "%${filterValue}%"])) 548: #elseif($propType == 'StaticListClass' || $propType == 'DBListClass' || $propType == 'DBTreeListClass') 549: #set($multiSelect = $propClass.get($colname).getProperty('multiSelect').getValue()) 550: #set($relationalStorage = $propClass.get($colname).getProperty('relationalStorage').getValue()) 551: #if($multiSelect == 1) 552: #if($relationalStorage == 1) 553: #set($fromSql = "${fromSql}, DBStringListProperty ${safe_tableAlias}") 554: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and ? in elements(${safe_tableAlias}.list)") 555: #set($discard = $whereParams.addAll(["${colname}", "${filterValue}"])) 556: #else 557: #set($fromSql = "${fromSql}, StringListProperty ${safe_tableAlias}") 558: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and upper(${safe_tableAlias}.textValue) like upper(?)") 559: #set($discard = $whereParams.addAll(["${colname}", "%${filterValue}%"])) 560: #end 561: #else 562: #set($fromSql = "${fromSql}, StringProperty ${safe_tableAlias}") 563: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and ${safe_tableAlias}.value = ?") 564: #set($discard = $whereParams.addAll(["${colname}", "${filterValue}"])) 565: #end 566: #else 567: #set($fromSql = "${fromSql}, StringProperty ${safe_tableAlias}") 568: #set($whereSql = "${whereSql} and obj.id=${safe_tableAlias}.id.id and ${safe_tableAlias}.id.name = ? and upper(${safe_tableAlias}.value) like upper(?)") 569: #set($discard = $whereParams.addAll(["${colname}", "%${filterValue}%"])) 570: #end 571: #end 572: #end 573: 574: #** 575: * Old alias of the #livetable_addColumnToQuery macro. 576: * @deprecated since 2.2.3, use {@link #livetable_addColumnToQuery} 577: *# 578: #macro(grid_addcolumn $colname) 579: #livetable_addColumnToQuery($colname) 580: #end 581: 582: {{/velocity}}