- Created by svitlana (Deactivated), last modified by Dam on Oct 30, 2023
You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 27 Current »
This page is describes our to use all Java APIs for Table Grid Next Generation Server / Datacenter. You can use an app such as ScriptRunner for Jira to be able to run Groovy / Java scripts directly inside Jira Software Server / Datacenter. Check the Javadoc for Table Grid Next Generation Server / Datacenter for more detail documentation. (dead link, we are working on it)
Contents
Java API Examples
readFieldData usage example
The example script reads all data from a Grid custom field with default configuration called API Sample in issue TEST-1.
// This script reads all data from a Grid custom field with default // configuration named "API Sample" in issue TEST-1 import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.Issue import com.atlassian.jira.issue.IssueManager import com.atlassian.jira.issue.fields.CustomField import com.atlassian.plugin.PluginAccessor import com.atlassian.jira.user.ApplicationUser // Get issue id IssueManager issueManager = ComponentAccessor.getOSGiComponentInstanceOfType(IssueManager.class) Issue issue = issueManager.getIssueObject("TEST-1") Long issueId = issue.getId() // Get TGNG custom field id CustomFieldManager customFieldManager = ComponentAccessor.getOSGiComponentInstanceOfType(CustomFieldManager.class) CustomField tgngCustomField = customFieldManager.getCustomFieldObjectsByName("API Sample").get(0) Long tgngCustomFieldId = tgngCustomField.getIdAsLong() ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() // Get GridService PluginAccessor pluginAccessor = ComponentAccessor.getPluginAccessor() Class apiServiceClass = pluginAccessor.getClassLoader().findClass("com.idalko.tgng.jira.server.api.GridService") def gridService = ComponentAccessor.getOSGiComponentInstanceOfType(apiServiceClass) // Read field data def fieldData = gridService.readFieldData(issueId, tgngCustomFieldId, user, null) def gridRows = fieldData.getRows() StringBuilder result = new StringBuilder() for (row in gridRows) { def columns = row.getColumns() result.append("Order: ${columns.get("jseq")}, ") result.append("Summary: ${columns.get("jsummary")}, ") def assignee = columns.get("jassignee") result.append("Assignee: ${assignee == null ? "null" : assignee.get("username")}, ") result.append("Status: ${columns.get("jstatus")};<br>") } return result
addRows usage example
The example script adds 2 rows to a Grid custom field with default configuration called API Sample in issue TEST-1.
// This script adds two rows to Grid custom field with default configuration // named "API Sample" in issue TEST-1 import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.Issue import com.atlassian.jira.issue.IssueManager import com.atlassian.jira.issue.fields.CustomField import com.atlassian.plugin.PluginAccessor import com.atlassian.jira.user.ApplicationUser // Get issue id IssueManager issueManager = ComponentAccessor.getOSGiComponentInstanceOfType(IssueManager.class) Issue issue = issueManager.getIssueObject("TEST-1") Long issueId = issue.getId() // Get TGNG custom field id CustomFieldManager customFieldManager = ComponentAccessor.getOSGiComponentInstanceOfType(CustomFieldManager.class) CustomField tgngCustomField = customFieldManager.getCustomFieldObjectsByName("API Sample").get(0) Long tgngCustomFieldId = tgngCustomField.getIdAsLong() ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() // Get GridService PluginAccessor pluginAccessor = ComponentAccessor.getPluginAccessor() Class apiServiceClass = pluginAccessor.getClassLoader().findClass("com.idalko.tgng.jira.server.api.GridService") def gridService = ComponentAccessor.getOSGiComponentInstanceOfType(apiServiceClass) // Add a row // Only "key" is required for userlist columns gridService.addRows(issueId, tgngCustomFieldId, user, [ ["jsummary": "Buy groceries", "jassignee": ["key": user.getKey()], "jstatus": "Open"], ["jsummary": "Plan vacation", "jassignee": ["key": user.getKey()], "jstatus": "In Progress"] ])
updateRows usage example
The example moves all rows assigned to a current user in status In Review to status Closed in a Grid custom field with default configuration called API Sample in issue TEST-1.
// This script moves all rows assigned to a current user in status "In Review" // to status "Closed" in a Grid custom field with default configuration named // "API Sample" in issue TEST-1 import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.Issue import com.atlassian.jira.issue.IssueManager import com.atlassian.jira.issue.fields.CustomField import com.atlassian.plugin.PluginAccessor import com.atlassian.jira.user.ApplicationUser // Get issue id IssueManager issueManager = ComponentAccessor.getOSGiComponentInstanceOfType(IssueManager.class) Issue issue = issueManager.getIssueObject("TEST-1") Long issueId = issue.getId() // Get TGNG custom field id CustomFieldManager customFieldManager = ComponentAccessor.getOSGiComponentInstanceOfType(CustomFieldManager.class) CustomField tgngCustomField = customFieldManager.getCustomFieldObjectsByName("API Sample").get(0) Long tgngCustomFieldId = tgngCustomField.getIdAsLong() ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() // Get GridService PluginAccessor pluginAccessor = ComponentAccessor.getPluginAccessor() Class apiServiceClass = pluginAccessor.getClassLoader().findClass("com.idalko.tgng.jira.server.api.GridService") def gridService = ComponentAccessor.getOSGiComponentInstanceOfType(apiServiceClass) // Get GridRow class Class gridRowClass = pluginAccessor.getClassLoader().findClass("com.idalko.tgng.jira.server.api.GridRow") // Read field data def fieldData = gridService.readFieldData(issueId, tgngCustomFieldId, user, null) def gridRows = fieldData.getRows() // Update rows def updates = new ArrayList() for (row in gridRows) { def columns = row.getColumns() def assignee = columns.get("jassignee") if (assignee != null && assignee.get("key") == user.getKey() && columns.get("jstatus") == "In Review") { def update = gridRowClass.newInstance() update.setRowId(row.getRowId()) // We need to specify only the columns which are being updated update.setColumns(["jstatus": "Closed"]) updates.add(update) } } gridService.updateRows(issueId, tgngCustomFieldId, user, updates)
deleteRows usage example
The example script deletes all rows assigned to a current user in status Closed in a Grid custom field with default configuration called API Sample in issue TEST-1.
// This script deletes all rows assigned to a current user in status "Closed" in // a Grid custom field with default configuration named "API Sample" in issue TEST-1 import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.Issue import com.atlassian.jira.issue.IssueManager import com.atlassian.jira.issue.fields.CustomField import com.atlassian.plugin.PluginAccessor import com.atlassian.jira.user.ApplicationUser // Get issue id IssueManager issueManager = ComponentAccessor.getOSGiComponentInstanceOfType(IssueManager.class) Issue issue = issueManager.getIssueObject("TEST-1") Long issueId = issue.getId() // Get TGNG custom field id CustomFieldManager customFieldManager = ComponentAccessor.getOSGiComponentInstanceOfType(CustomFieldManager.class) CustomField tgngCustomField = customFieldManager.getCustomFieldObjectsByName("API Sample").get(0) Long tgngCustomFieldId = tgngCustomField.getIdAsLong() ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() // Get GridService PluginAccessor pluginAccessor = ComponentAccessor.getPluginAccessor() Class apiServiceClass = pluginAccessor.getClassLoader().findClass("com.idalko.tgng.jira.server.api.GridService") def gridService = ComponentAccessor.getOSGiComponentInstanceOfType(apiServiceClass) // Read field data def fieldData = gridService.readFieldData(issueId, tgngCustomFieldId, user, null) def gridRows = fieldData.getRows() // Ids of rows to delete def toDelete = new ArrayList() for (row in gridRows) { def columns = row.getColumns() def assignee = columns.get("jassignee") if (assignee != null && assignee.get("key") == user.getKey() && columns.get("jstatus") == "Closed") { toDelete.add(row.getRowId()) } } gridService.deleteRows(issueId, tgngCustomFieldId, user, toDelete)
readFieldDataInEditMode usage example
The example script checks whether a sample Grid custom field contains values on transition and throws an error otherwise.
// This script checks that Grid custom field named "API Sample" contains at least one row. // Can be used only as scripted validator of issue transition. Cannot be run from the Script Console. import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.fields.CustomField import com.atlassian.jira.user.ApplicationUser import com.onresolve.scriptrunner.runner.customisers.WithPlugin import com.opensymphony.workflow.InvalidInputException @WithPlugin("tge.cloud") import com.idalko.tgng.jira.server.api.GridFieldData import com.idalko.tgng.jira.server.api.GridService // Get TGNG custom field id String tgngCustomFieldName = "API Sample" CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager() CustomField tgngCustomField = customFieldManager.getCustomFieldObjectsByName(tgngCustomFieldName).iterator().next() Long tgngCustomFieldId = tgngCustomField.getIdAsLong() // Get user ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() // Get GridService GridService gridService = ComponentAccessor.getOSGiComponentInstanceOfType(GridService) // Read field data GridFieldData fieldData = gridService.readFieldDataInEditMode(issue, tgngCustomFieldId, user) // Check if the grid is empty if (fieldData.rows.size() == 0) { // Throw an exception with the field id and an error message for TGNG field // it will prevent transition with the noted error, user will stay on the transition screen. throw new InvalidInputException(tgngCustomField.id, "Add at least one record to grid to proceed") }
Related articles
Extract Information from the Grid using the Java API
- No labels