General Actions:
Log-in
Register
Wiki:
Main wiki
▼
:
Document Index
»
Space:
XWiki
▼
:
Document Index
»
Page:
ExtensionManagerMacros
Search
en
Page Actions:
Export
▼
:
Export as PDF
Export as RTF
Export as HTML
More actions
▼
:
Print preview
View Source
Main wiki
»
XWiki Space
»
XWiki Preferences
»
AdminSheet
»
ExtensionManagerMacros
Wiki source code of
ExtensionManagerMacros
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: $xwiki.ssx.use('ExtensionManagerMacros') 3: $xwiki.jsx.use('ExtensionManagerMacros') 4: 5: #set ($extensionManager = $services.extension) 6: 7: #if ($request.extensionwiki && $request.extensionwiki.trim() != '') 8: #set($extensionwiki = $request.extensionwiki) 9: #else 10: #if (!$xcontext.isMainWiki()) 11: #set($extensionwiki = $xcontext.database) 12: #end 13: #end 14: 15: #if ($extensionwiki) 16: #set($extensionnamespace = "wiki:${extensionwiki}") 17: #end 18: 19: #macro (displayExtensionSearchBar) 20: (% class="extHeader" %)((( 21: (% class="extHeaderLeft" %)((( 22: {{html}} 23: <form class="xform half" action="$doc.getURL($xcontext.action, $request.getQueryString().replaceAll('(^|&)actionshowdetails=[^&]++&?', '$1').replaceAll('(^|&)(extension(id|version)=[^&]++&?+)+', '$1').replaceAll('(^|&)section=[^&]++', '$1section=XWiki.AddExtensions').replaceAll('(^|&)searchextension=[^&]++&?', '$1'))" method="post"> 24: <div class="globalsearch extHeaderLeftSearch"> 25: <label class="label" for="extensionsearchinput">$msg.get('extensions.search.title')</label><input type="text" class="globalsearchinput#if ("$!request.searchextension" == '') withTip#end extHeaderLeftInput" id="extensionsearchinput" name="searchextension" value="#if ("$!request.searchextension" != '')${request.searchextension}#{else}$msg.get('extensions.search.tip')#{end}" size="60"><input type="image" class="button" value="$msg.get('panels.search.submit')" alt="$msg.get('panels.search.submit')" src="$xwiki.getSkinFile('icons/xwiki/search.png')"> 26: </div> 27: </form> 28: {{/html}} 29: ))) 30: (% class="extHeaderRight" %)((( 31: ## Advanced install form 32: {{html clean="false"}} 33: <form action="$escapetool.xml($doc.getURL($xcontext.action, $request.getQueryString()))" method="post" class="xform"> 34: <fieldset id="advancedextensionsearch"> 35: <div id="advancedextensionsearch-body"></div> 36: <legend><a href="#advancedextensionsearch-body">$msg.get('extensions.advancedSearch.title')</a></legend> 37: <div class="plainmessage advancedsearchpopup hidden"> 38: <input type="hidden" name="xback" value="$escapetool.xml($doc.getURL($xcontext.action, $request.queryString))" /> 39: <dl> 40: <dt><label for="advancedextensionsearch-id">$msg.get('extensions.advancedSearch.id.label')</label></dt> 41: <dd><input type="text" name="extensionid" id="advancedextensionsearch-id" value="" /></dd> 42: <dt><label for="advancedextensionsearch-version">$msg.get('extensions.advancedSearch.version.label')</label></dt> 43: <dd><input type="text" name="extensionversion" id="advancedextensionsearch-version" value="" /></dd> 44: #if ($xcontext.isMainWiki() && $xwiki.isVirtualMode()) 45: <dt><label for="advancedextensionsearch-wiki">$msg.get('extensions.advancedSearch.wiki.label')</label></dt> 46: <dd><input type="text" name="extensionwiki" id="advancedextensionsearch-wiki" value="" /></dd> 47: #end 48: </dl> 49: <p><span class="buttonwrapper"><input type="submit" name="actioninstall" value="$msg.get('extensions.advancedSearch.actions.submit')" class="button" /></span> 50: <span class="buttonwrapper"><a href="#searchextension" class="actioncancel secondary button">$msg.get('extensions.advancedSearch.actions.cancel')</a></span></p> 51: </div> 52: </fieldset> 53: </form> 54: {{/html}} 55: ))) 56: (% class="clearfloats" %)((())) 57: ))) 58: #end 59: 60: #macro (displayExtensionName $extension $actions) 61: #set ($name = "$!{extension.name}") 62: #if ($name == '') 63: #set ($name = "$!{extension.id.id}") 64: #if ($name.indexOf(':') >= 0) 65: #set ($name = $name.substring($mathtool.add($name.indexOf(':'), 1))) 66: #end 67: #end 68: $name## 69: #end 70: 71: #macro (displayExtension $extension) 72: #determineExtensionStatus($extension.id, $extensionnamespace, $extensionStatus) 73: #set ($actions = []) 74: #computeXBack() 75: #if ($extensionStatus == 'core') 76: #getCoreExtensionButtons($actions) 77: #elseif ($extensionStatus == 'installed') 78: #getInstalledExtensionButtons($actions) 79: #elseif ($extensionStatus == 'remote') 80: #getRemoteExtensionButtons($actions) 81: #end 82: (% class="extension-item# extension-item-${extensionStatus}" %)((( 83: (% class="extension-header" %)((( 84: (% class="extension-name" %) 85: ==#displayExtensionName($extension) (% class="extension-version %)$extension.id.version== 86: 87: {{html}} 88: #if ($doc.name == 'XWikiPreferences') 89: #set ($action = 'admin') 90: #else 91: #set ($action = 'view') 92: #end 93: <form method="post" action="$doc.getURL($action, $request.getQueryString().replaceAll('(^|&)actionshowdetails=[^&]++', ''))"> 94: <div class="extension-actions"> 95: <input type="hidden" name="extensionid" value="$extension.id.id" /> 96: <input type="hidden" name="extensionversion" value="$extension.id.version" /> 97: #foreach ($action in $actions) 98: ${action}## 99: #end 100: </div> 101: </form> 102: {{/html}} 103: 104: #if ($extension.authors.size() > 0) 105: (% class="extension-authors" %)((( 106: $msg.get('extensions.info.authors') ## 107: #foreach ($author in $extension.authors) 108: #if ($author.name == 'devs') 109: [[$msg.get('extensions.info.authors.xwikiorg')>>http://www.xwiki.org/]]## 110: #elseif ("$!author.url" != '' && "$!author.name" != '') 111: [[${author.name}>>${author.url}]]## 112: #else 113: ${author.name}## 114: #end 115: #if ($foreach.hasNext), ## 116: #else ))) 117: 118: #end 119: #end 120: #end 121: #if ("$!{extension.summary}" != '') 122: (% class="extension-description" %) 123: {{{ 124: $extension.summary.replaceAll('\s+', ' ') 125: }}} 126: 127: #end 128: (% class="clearfloats" %)((())) 129: ))) 130: #if ($request.actionshowdetails) 131: #set ($backwardDependencies = $extensionManager.getBackwardDependencies($extension.id.id, $extension.id.version)) 132: #if (!$backwardDependencies) 133: #set ($backwardDependencies = {}) 134: #end 135: (% class="extension-body" %)((( 136: (% class="innerMenu" %) 137: * [[$msg.get('extensions.info.category.description')>>||anchor="extension-body-description-${extension.id.id}-${extension.id.version}"]] 138: #if ("$!{extension.releaseNotes}" != '') 139: * [[$msg.get('extensions.info.category.releaseNotes')>>||anchor="extension-body-relnotes-${extension.id.id}-${extension.id.version}"]] 140: #end 141: #if ($extension.dependencies.size() > 0 || $backwardDependencies.size() > 0) 142: * [[$msg.get('extensions.info.category.dependencies')>>||anchor="extension-body-dependencies-${extension.id.id}-${extension.id.version}"]] 143: #end 144: 145: {{id name="extension-body-description-${extension.id.id}-${extension.id.version}" /}} 146: (% class="extension-body-description extension-body-section" %)((( 147: (% class="extension-metadata" %) 148: * $msg.get('extensions.info.license', [$extension.licenses.size()]) ## 149: #foreach ($license in $extension.licenses) 150: ${license.name}## 151: #if ($foreach.hasNext), #end 152: #end 153: 154: #if ($extension.repository.id.URI && $extension.repository.id.URI.scheme != 'file') 155: * $msg.get('extensions.info.repository') [[$extension.repository.id.id>>$extension.repository.id.URI]] 156: #end 157: #if ($extension.dependency) 158: * $msg.get('extensions.info.dependency') 159: #end 160: #if ("$!{extension.webSite}" != '') 161: * $msg.get('extensions.info.website') [[$extension.webSite.replaceAll('^[^/]++//([^/]++)/?.*+$', '$1')>>$extension.webSite]] 162: #end 163: #if ($extension.features.size() > 0) 164: * $msg.get('extensions.info.features') $extension.features 165: #end 166: #if ($xwiki.virtualMode) 167: #if (!$extension.namespaces || $extension.namespaces.size() == 0) 168: * $msg.get('extensions.info.namespaces.global') 169: #else 170: * $msg.get('extensions.info.namespaces.list') #foreach ($namespace in $extension.namespaces)$namespace#if($foreach.hasNext), #end#end 171: 172: #end 173: #end 174: 175: ## TODO: need a decision on what exactly is the description and how it should be safely displayed (wiki syntax, server side generated HTML, etc) 176: ## $!extension.description 177: ))) 178: 179: #if ("$!{extension.releaseNotes}" != '') 180: {{id name="extension-body-relnotes-${extension.id.id}-${extension.id.version}"/}} 181: (% class="extension-body-relnotes extension-body-section" %)((( 182: $!{extension.releaseNotes} 183: ))) 184: #end 185: 186: {{id name="extension-body-dependencies-${extension.id.id}-${extension.id.version}" /}} 187: #computeXBack() 188: (% class="extension-body-dependencies extension-body-section" %)((( 189: $msg.get('extensions.info.dependencies.directDependencies', [$extension.dependencies.size()]) 190: #foreach ($dependency in $extension.dependencies) 191: #set ($dependencyExtension = $extensionManager.resolve($dependency)) 192: #set ($dependencyClass = "$!{dependencyExtension.class}") 193: #if ($dependencyExtension) 194: * [[#displayExtensionName($dependencyExtension)>>## 195: #if ($dependencyClass.endsWith('CoreExtension')) 196: path:$doc.getURL($xcontext.action, "actionshowdetails=true&extensionid=${dependency.id}&extensionversion=${dependency.versionConstraint}§ion=XWiki.CoreExtensions&xback=${escapetool.url($xback)}")||class="dependency-type-core"]] 197: #elseif ($dependencyClass.endsWith('LocalExtension')) 198: path:$doc.getURL($xcontext.action, "actionshowdetails=true&extensionid=${dependency.id}&extensionversion=${dependency.versionConstraint}§ion=XWiki.InstalledExtensions&xback=${escapetool.url($xback)}")||class="dependency-type-installed"]] 199: #else 200: path:$doc.getURL($xcontext.action, "actionshowdetails=true&extensionid=${dependency.id}&extensionversion=${dependency.versionConstraint}§ion=XWiki.AddExtensions&xback=${escapetool.url($xback)}")||class="dependency-type-remote"]] 201: #end 202: #else 203: * (% class="dependency-type-unknown" %)${dependency.id} 204: #end 205: #if (!$foreach.hasNext) 206: 207: #end 208: #end 209: $msg.get('extensions.info.dependencies.backwardDependencies', [$backwardDependencies.size()]) 210: #foreach ($namespace in $backwardDependencies.entrySet()) 211: #foreach ($dependency in $namespace.value) 212: #set ($dependencyClass = "${dependency.class}") 213: * [[#displayExtensionName($dependency)>>## 214: #if ($dependencyClass.endsWith('CoreExtension')) 215: path:$doc.getURL($xcontext.action, "actionshowdetails=true&extensionid=${dependency.id.id}&extensionversion=${dependency.id.version}§ion=XWiki.CoreExtensions&xback=${escapetool.url($xback)}")||class="dependency-type-core"]]## 216: #elseif ($dependencyClass.endsWith('LocalExtension')) 217: path:$doc.getURL($xcontext.action, "actionshowdetails=true&extensionid=${dependency.id.id}&extensionversion=${dependency.id.version}§ion=XWiki.InstalledExtensions&xback=${escapetool.url($xback)}")||class="dependency-type-installed"]]## 218: #else 219: path:$doc.getURL($xcontext.action, "actionshowdetails=true&extensionid=${dependency.id.id}&extensionversion=${dependency.id.version}§ion=XWiki.AddExtensions&xback=${escapetool.url($xback)}")||class="dependency-type-remote"]]## 220: #end 221: #if ("$!{namespace.key}" != '') 222: $msg.get('extensions.info.dependency.wiki', [$namespace.key]) 223: #else 224: 225: #end 226: #end 227: #end 228: ))) 229: ))) 230: #end 231: ))) 232: #end 233: 234: #macro (handleInstallExtensionRequest) 235: (% class="full column" %)((( 236: #displayExtensionSearchBar() 237: = $msg.get('extensions.install.title', ["//#displayExtensionName($extensionManager.resolve($request.extensionid, $request.extensionversion))//"]) = 238: 239: #if (!$request.extensionid || !$request.extensionversion) 240: {{error}}$msg.get('extensions.install.error.missingIdOrVersion'){{/error}} 241: #elseif ($request.confirm) 242: #set($installJob = $extensionManager.install($request.extensionid, $request.extensionversion, $extensionwiki)) 243: #set($lasterror = $extensionManager.lastError) 244: #if ($lasterror) 245: #if($extensionwiki) 246: {{error}}$msg.get('extensions.install.error.installFailure.onWiki', [$request.extensionid, $request.extensionversion, $extensionwiki]) ## 247: #else 248: {{error}}$msg.get('extensions.install.error.installFailure', [$request.extensionid, $request.extensionversion]) ## 249: #end 250: #printThrowable($lasterror){{/error}} 251: #else 252: {{box}}#printJobLog($installJob){{/box}} 253: #end 254: #else 255: #set($installPlan = $extensionManager.createInstallPlan($request.extensionid, $request.extensionversion, $extensionnamespace)) 256: #if (!$installPlan) 257: {{error}}$msg.get('extensions.install.error.prepareFailure', [$request.extensionid, $request.extensionversion, $lasterror.message]){{/error}} 258: #else 259: #set($hasError = false) 260: #foreach($log in $installPlan.log) 261: #if ($log.level.name() == 'ERROR') 262: #set($hasError = true) 263: #end 264: #end 265: ## 266: #if ($hasError) 267: {{box}}#printStatusLog($installPlan){{/box}} 268: #else 269: #set($extensionsToInstall = []) 270: #set($extensionsToUpgrade = []) 271: ## 272: #foreach($planAction in $installPlan.actions) 273: #if ($planAction.action.name() == "INSTALL") 274: #set($void = $extensionsToInstall.add($planAction)) 275: #elseif ($planAction.action.name() == "UPGRADE") 276: #set($void = $extensionsToUpgrade.add($planAction)) 277: #end 278: #end 279: ## 280: #if ($extensionsToInstall.isEmpty() && $extensionsToUpgrade.isEmpty()) 281: {{info}}$msg.get('extensions.install.error.alreadyInstalled'){{/info}} 282: #else 283: #if (!$extensionsToInstall.isEmpty()) 284: $msg.get('extensions.install.list.new') 285: #foreach ($planAction in $extensionsToInstall) 286: * $planAction.extension.id.id ($planAction.extension.id.version) 287: #end 288: 289: #end 290: #if (!$extensionsToUpgrade.isEmpty()) 291: $msg.get('extensions.install.list.upgrade') 292: #foreach ($planAction in $extensionsToUpgrade) 293: * $planAction.extension.id.id ($planAction.extension.id.version) 294: #end 295: 296: #end 297: {{html}} 298: <form action="$xwiki.requestURL" enctype="multipart/form-data" method="post" class="xform"> 299: <div> 300: <input name="extensionid" value="${escapetool.xml($request.extensionid)}" type="hidden" /> 301: <input name="extensionversion" value="${escapetool.xml($request.extensionversion)}" type="hidden" /> 302: #if ($extensionwiki) 303: <input name="extensionwiki" value="$extensionwiki" type="hidden" /> 304: #end 305: <input name="actioninstall" type="hidden" /> 306: <p> 307: <span class="buttonwrapper"><input type="submit" value="$msg.get('extensions.install.actions.submit')" name="confirm" class="button"/></span> 308: #if ("$!{request.xback}" != '') 309: <span class="buttonwrapper"><a href="${request.xback}" class="secondary button">$msg.get('extensions.install.actions.cancel')</a></span> 310: #end 311: </p> 312: </div> 313: </form> 314: {{/html}} 315: #end 316: #end 317: #end 318: #end 319: ))) 320: #end 321: 322: #macro (handleUninstallExtensionRequest) 323: (% class="full column" %)((( 324: = $msg.get('extensions.uninstall.title', ["//#displayExtensionName($extensionManager.resolve($request.extensionid, $request.extensionversion))//"]) = 325: 326: #if (!$request.extensionid || !$request.extensionversion) 327: {{error}}$msg.get('extensions.uninstall.error.missingIdOrVersion'){{/error}} 328: #elseif ($request.confirm) 329: #set($uninstallJob = $extensionManager.uninstall($request.extensionid, null)) 330: #set($lasterror = $extensionManager.lastError) 331: #if ($lasterror) 332: {{error}} 333: $msg.get('extensions.uninstall.error.uninstallFailure', [$request.extensionid, $request.extensionversion]) ## 334: #printThrowable($lasterror) 335: {{/error}} 336: #else 337: {{box}} 338: #printJobLog($uninstallJob) 339: {{/box}} 340: #end 341: #else 342: #set($uninstallPlan = $extensionManager.createUninstallPlan($request.extensionid, $extensionnamespace)) 343: #if (!$uninstallPlan) 344: {{error}}$msg.get('extensions.uninstall.error.prepareFailure', [$request.extensionid, $request.extensionversion, $lasterror.message]){{/error}} 345: #else 346: #set($hasError = false) 347: #foreach($log in $uninstallPlan.log) 348: #if ($log.level.name() == 'ERROR') 349: #set($hasError = true) 350: #end 351: #end 352: ## 353: #if ($hasError) 354: {{box}}#printStatusLog($installPlan){{/box}} 355: #else 356: #set($extensionsToUninstall = []) 357: ## 358: #foreach($planAction in $uninstallPlan.actions) 359: #if ($planAction.action.name() == "UNINSTALL") 360: #set($void = $extensionsToUninstall.add($planAction)) 361: #end 362: #end 363: ## 364: #if ($extensionsToUninstall.isEmpty()) 365: {{info}}$msg.get('extensions.uninstall.error.notInstalled'){{/info}} 366: #else 367: The following extensions will be removed: 368: #foreach ($planAction in $extensionsToUninstall) 369: * $planAction.extension.id.id ($planAction.extension.id.version) 370: #end 371: 372: {{html}} 373: <form action="$xwiki.requestURL" enctype="multipart/form-data" method="post" class="xform"> 374: <div> 375: <input name="extensionid" value="${escapetool.xml($request.extensionid)}" type="hidden" /> 376: <input name="extensionversion" value="${escapetool.xml($request.extensionversion)}" type="hidden" /> 377: <input name="actionuninstall" type="hidden" /> 378: <p> 379: <span class="buttonwrapper"><input type="submit" value="$msg.get('extensions.uninstall.actions.submit')" name="confirm" class="button"/></span> 380: #if ("$!{request.xback}" != '') 381: <span class="buttonwrapper"><a href="${request.xback}" class="secondary button">$msg.get('extensions.uninstall.actions.cancel')</a></span> 382: #end 383: </p> 384: </div> 385: </form> 386: {{/html}} 387: #end 388: #end 389: #end 390: #end 391: ))) 392: #end 393: 394: #macro (printThrowable $throwable) 395: $throwable.class: #if(!$throwable.message)null#else$throwable.message#end 396: 397: #foreach($stackTraceElement in $throwable.stackTrace) 398: ~ at $stackTraceElement 399: #end 400: #if ($throwable.cause) 401: Caused by: #printThrowable($throwable.cause) 402: #end 403: #end 404: 405: #macro (printJobLog $job) 406: #printStatusLog($job.status) 407: #end 408: 409: #macro (printStatusLog $status) 410: #foreach ($log in $status.log) 411: #set ($logLevel = $log.level.toString().toLowerCase()) 412: #if ($logLevel == 'warn') 413: #set ($logLevel = 'warning') 414: #end 415: {{$logLevel}} 416: $log.formattedMessage 417: #if ($log.throwable) 418: #printThrowable($log.throwable) 419: #end 420: {{/$logLevel}} 421: #end 422: #end 423: 424: #macro (computeXBack) 425: #set ($xback = "$!{request.xback}") 426: #if ($xback == '') 427: #set ($params = '') 428: #foreach ($parameterName in $request.parameterNames) 429: #if (!$parameterName.startsWith('action') && !$parameterName.startsWith('extension')) 430: #foreach ($value in $request.getParameterValues($parameterName)) 431: #set ($params = "${params}&${parameterName}=${value}") 432: #end 433: #end 434: #end 435: #if ($params.length() > 0) 436: #set ($params = $params.substring(1)) 437: #end 438: #set ($xback = $doc.getURL($xcontext.action, $params)) 439: #end 440: #end 441: 442: #macro (getCoreExtensionButtons $actions) 443: #if ($request.extensionid && $request.extensionversion && $request.ajax) 444: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""showdetails"" value=""$msg.get('extensions.actions.showDetails')"" class=""button visibilityAction"" /></span>")) 445: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""hidedetails"" value=""$msg.get('extensions.actions.hideDetails')"" class=""button visibilityAction"" /></span>")) 446: #elseif ($request.actionshowdetails) 447: #set ($discard = $actions.add("<span class=""buttonwrapper""><a href=""${xback}"" class=""button"">$msg.get('extensions.actions.back')</a></span>")) 448: #else 449: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""actionshowdetails"" value=""$msg.get('extensions.actions.showDetails')"" class=""button""/></span><input type=""hidden"" name=""xback"" value=""${xback}"" />")) 450: #end 451: #end 452: 453: #macro (getInstalledExtensionButtons $actions) 454: #if ($request.extensionid && $request.extensionversion && $request.ajax) 455: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""showdetails"" value=""$msg.get('extensions.actions.showDetails')"" class=""button visibilityAction""/></span>")) 456: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""hidedetails"" value=""$msg.get('extensions.actions.hideDetails')"" class=""button visibilityAction""/></span>")) 457: #elseif ($request.actionshowdetails) 458: #set ($discard = $actions.add("<span class=""buttonwrapper""><a href=""${xback}"" class=""button"">$msg.get('extensions.actions.back')</a></span>")) 459: #else 460: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""actionshowdetails"" value=""$msg.get('extensions.actions.showDetails')"" class=""button""/></span><input type=""hidden"" name=""xback"" value=""${xback}"" />")) 461: #end 462: #if ($hasProgramming) 463: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""actionuninstall"" value=""$msg.get('extensions.actions.uninstall')"" class=""button secondary""/></span>")) 464: #end 465: #end 466: 467: #macro (getRemoteExtensionButtons $actions) 468: #if ($request.extensionid && $request.extensionversion && $request.ajax) 469: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""showdetails"" value=""$msg.get('extensions.actions.showDetails')"" class=""button visibilityAction"" /></span>")) 470: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""hidedetails"" value=""$msg.get('extensions.actions.hideDetails')"" class=""button visibilityAction"" /></span>")) 471: #elseif ($request.actionshowdetails) 472: #set ($discard = $actions.add("<span class=""buttonwrapper""><a href=""${xback}"" class=""button"">$msg.get('extensions.actions.back')</a></span>")) 473: #else 474: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""actionshowdetails"" value=""$msg.get('extensions.actions.showDetails')"" class=""button""/></span><input type=""hidden"" name=""xback"" value=""${xback}"" />")) 475: #end 476: #if ($hasProgramming) 477: #set ($discard = $actions.add("<span class=""buttonwrapper""><input type=""submit"" name=""actioninstall"" value=""$msg.get('extensions.actions.install')"" class=""button""/></span>")) 478: #end 479: #end 480: 481: #macro (determineExtensionStatus $extensionId $namespace $extensionStatus) 482: #if ($extensionManager.getInstalledExtension($extensionId.id, $namespace)) 483: #set ($result = 'installed') 484: #elseif ($extensionManager.getCoreExtension($extensionId.id)) 485: #set ($result = 'core') 486: #else 487: #set ($result = 'remote') 488: #end 489: #set ($extensionStatus = $NULL) 490: #setVariable ("$extensionStatus" $result) 491: #end 492: {{/velocity}}