Come for the products,
stay for the community

The Atlassian Community can help you and your team get more value out of Atlassian products and practices.

Atlassian Community about banner
4,300,030
Community Members
 
Community Events
165
Community Groups

How to create an additional jira-page with scriptrunner

It is possible to enhance existing jira pages with scriptrunner, but I can'T figure out, how to create a new page. Is this at all possible?

Current example: I wrote a script to display the configuration of all my jira servicedesk queues. I use it for QA, because I wan't to check, if all queues display the same fields in the same order. Works well.

I can of course run the script in adaptavist script console. It formats its output as html, which is then displayed when I press the run button. 

But I'd like to run the script on clicking a menu item and have it display the result in it's own page. Or link it as a new page in the admin pages. Or, if not possible otherwise, package it in a gadget and use it on a dashboard.

There seem's to be no way to do any of this. I would not want to create a extra-pane in an issue-view. 

Any idea, anyone?

4 comments

I can't think of a way to do this without writing an app that would inject a new page into Jira.  

You could get the content for such a page from ScriptRunnner, I'm sure, and I've written gadgets that draw 99% of their content from a ScriptRunner REST endpoint, so I know that works.  But I don't know a way SR could create an entire new page on its own.

Maybe SR could make this a new feature?

A new option in "create script fragment":

Custom page

Parameters: 

  • relativ url the page shall be reached by
  • script to call to render page content

Depending on where in the navigation hierarchy lives, the page would need a different template.

When I need to do something like this I just create a dialog box and make it really big. Not ideal but it works.

Would be a cool feature though.

OK, I've figured this out.

Firstly with REST endpoint we can create a simple HTML page

import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import groovy.transform.BaseScript
import javax.servlet.http.HttpServletRequest
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response

@BaseScript CustomEndpointDelegate delegate

testPage() { MultivaluedMap queryParams, body, HttpServletRequest request ->
Response.ok().type(MediaType.TEXT_HTML).entity("""<html>
<head>
<title>Hello World</title>
</head>
<body id="jira" class="aui-layout aui-theme-default">
<h1>Hello world</h1>
</body>
</html>
""").build()
}

The downside to this approach is

  • You can't use velocity or Soy templates
  • You can't add resources

I'm still working on templates but adding resources is easy (when you know how)

import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import groovy.transform.BaseScript
import com.atlassian.jira.component.ComponentAccessor
import javax.servlet.http.HttpServletRequest
import com.atlassian.webresource.api.UrlMode
import com.atlassian.webresource.api.assembler.PageBuilderService
import com.atlassian.webresource.api.assembler.WebResourceAssembler
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response

@BaseScript CustomEndpointDelegate delegate

testPage() { MultivaluedMap queryParams, body, HttpServletRequest request ->
PageBuilderService pageBuilderService = ComponentAccessor.getComponentOfType(PageBuilderService)
WebResourceAssembler assembler = pageBuilderService.assembler()
List<String> requiredResources = ["jira.webresources:jquery","jira.webresources:global-static"]
requiredResources.each{String moduleKey ->
assembler.resources().requireWebResource(moduleKey)
}

Writer sw = new StringWriter()
sw << """<html>
<head>
<title>Hello World</title>
"""
pageBuilderService.assembler().assembled().drainIncludedResources().writeHtmlTags(sw, UrlMode.AUTO)
sw << """</head>
<body id="jira" class="aui-layout aui-theme-default">
<h1>Hello world</h1>
</body>
</html>
"""

Response.ok().type(MediaType.TEXT_HTML).entity(sw.toString()).build()
}

Sorry for answering late, I didn't figure out, that your script really solves my problem:

Yes, that's it! Brilliant! Thank you!

Of course, I'd love to see the normal Jira-menus above my page, but I'll just activate the text gadget, so I can use it on a dedicated dashboard to display my new page in it via an iframe.

It's far from perfect, but it does meet my requirements. Our Jira is strictly internal, so the security implications of activating the text gadget are a lesser concern.

Hi @Daniel Garcia,

 

Can you provide sample screenshot for this rest endpoint result?

 

Thank you!

Comment

Log in or Sign up to comment
TAGS
Community showcase
Published in Jira Software

An update on Jira Software customer feedback – June 2022

Hello Atlassian Community! Feedback from customers like you has helped us shape and improve Jira Software. As Head of Product, Jira Software, I wanted to take this opportunity to share an update on...

31 views 0 2
Read article

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you