{
  "properties": {
    "description": {
      "maxLength": 1400,
      "type": "string",
      "fieldDescription": "\n\nA human readable description of what the add-on does. The description will be visible in the `Manage Add-ons`\n section of the administration console. Provide meaningful and identifying information for the instance administrator.\n\n"
    },
    "modules": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "keyboardShortcuts": {
          "items": {
            "properties": {
              "shortcut": {
                "pattern": "[a-z]{1,3}",
                "type": "string",
                "fieldDescription": "\n\nThe shortcut sequence. The current limitations are\n\n <ul>\n     <li>the sequence cannot shadow an existing product shortcut</li>\n     <li>can only contain lowercase letters</li>\n     <li>has to be shorter than 4 characters</li>\n </ul>\n\n"
              },
              "context": {
                "enum": [
                  "global",
                  "GLOBAL",
                  "issue_navigation",
                  "ISSUE_NAVIGATION",
                  "issue_action",
                  "ISSUE_ACTION",
                  "agile_board",
                  "AGILE_BOARD"
                ],
                "type": "string",
                "fieldDescription": "\n\nThe context in which the shortcut will be available. This is optional, if not given the shortcut is assumed to be global.\n Different products define different contexts.\n\n Jira supported contexts:\n <ul>\n     <li>global</li>\n     <li>issue&#95;navigation</li>\n     <li>issue&#95;action</li>\n     <li>agile&#95;board</li>\n </ul>\n\n"
              },
              "name": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nA human readable name.\n\n"
              },
              "key": {
                "pattern": "^[a-zA-Z0-9-]+$",
                "type": "string",
                "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
              },
              "target": {
                "properties": {
                  "key": {
                    "pattern": "^[a-zA-Z0-9-]+$",
                    "type": "string",
                    "fieldDescription": "\n\nThe key of the target module, defined in the add-on descriptor.\n\n"
                  }
                },
                "required": [
                  "key"
                ],
                "shortClassName": "keyboardShortcutTargetBean",
                "type": "object",
                "title": "Keyboard Shortcut Target",
                "description": "\n\nThe bean containing the key of the target module of the shortcut.\n\n",
                "fieldDescription": "\n\nThe target must be the key of another module defined by the add-on.\n\n Below are the actions which will be executed by the shortcut depending on the module type of the target.\n\n <ul>\n  <li>General Page: Navigates to the general page</li>\n  <li>Dialog: Opens the dialog</li>\n  <li>Web Item: Emulates clicking on the web item, which must be present on the current page</li>\n </ul>\n\n"
              }
            },
            "required": [
              "shortcut",
              "name",
              "key",
              "target"
            ],
            "shortClassName": "keyboardShortcutModuleBean",
            "type": "object",
            "title": "Keyboard Shortcut",
            "description": "\n\nThis module type adds the ability for an add-on to declare keyboard shortcuts.\n Currently only available for Jira.\n <p>\n A Connect keyboard shortcut can perform one of three actions:\n navigate to a page, open a dialog module, or invoke an action represented by a web-item on a page.\n Pages, dialog modules and web-items referenced by the shortcut must be declared by the same add-on.\n\n A shortcut is identified by a sequence of letters which need to be pressed in order for the shortcut action to be invoked.\n You cannot declare shortcuts that would shadow shortcuts defined by the product.\n A shortcut shadows all shortcuts which start with its sequence.\n\n On the other hand, it's possible to shadow shortcuts defined by the same or other add-ons, although those won't\n be accessible anymore.\n\n In case multiple shortcuts have the same sequence, there is no guarantee on which will be invoked.\n </p>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"keyboardShortcuts\": [\n          {\n            \"shortcut\": \"gmm\",\n            \"target\": {\n              \"key\": \"page-key\"\n            },\n            \"context\": \"global\",\n            \"name\": {\n              \"value\": \"My keyboard shortcut\"\n            },\n            \"key\": \"keyboard-shortcut-key\"\n          }\n        ]\n      }\n    }\n\n\n"
          },
          "type": "array"
        },
        "adminPages": {
          "items": {
            "$ref": "#/definitions/adminPageModule"
          },
          "type": "array"
        },
        "webPanels": {
          "items": {
            "$ref": "#/definitions/webPanel"
          },
          "type": "array"
        },
        "webhooks": {
          "items": {
            "$ref": "#/definitions/webhook"
          },
          "type": "array"
        },
        "postInstallPage": {
          "$ref": "#/definitions/pageModule"
        },
        "webSections": {
          "items": {
            "$ref": "#/definitions/webSection"
          },
          "type": "array"
        },
        "generalPages": {
          "items": {
            "$ref": "#/definitions/pageModule"
          },
          "type": "array"
        },
        "webItems": {
          "items": {
            "$ref": "#/definitions/webItem"
          },
          "type": "array"
        },
        "configurePage": {
          "$ref": "#/definitions/adminPageModule"
        },
        "dialogs": {
          "items": {
            "$ref": "#/definitions/dialog"
          },
          "type": "array"
        },
        "jiraEntityProperties": {
          "items": {
            "properties": {
              "entityType": {
                "enum": [
                  "issue",
                  "ISSUE",
                  "user",
                  "USER",
                  "project",
                  "PROJECT"
                ],
                "type": "string",
                "fieldDescription": "\n\nThe type of the entity. The default value is issue.\n\n",
                "defaultValue": "issue"
              },
              "name": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nA human readable name.\n\n"
              },
              "key": {
                "pattern": "^[a-zA-Z0-9-]+$",
                "type": "string",
                "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
              },
              "keyConfigurations": {
                "items": {
                  "properties": {
                    "propertyKey": {
                      "type": "string",
                      "fieldDescription": "\n\nThe key of the property from which the data is indexed.\n\n"
                    },
                    "extractions": {
                      "items": {
                        "properties": {
                          "objectName": {
                            "type": "string",
                            "fieldDescription": "\n\nThe objectName to the JSON data which is supposed to be indexed. The objectName will be the key of a flattened JSON object with '.' as the delimiter.\n\n For instance, for JSON <code>\"{\"label\": {\"color\": \"red\", \"text\":\"connect\"}}</code> the valid objectName\n referencing the color is label.color.\n\n It is important to note that the objectName can refer to an array type, where the 'type' field in the extraction should\n be the type of each element in the specified array.\n\n"
                          },
                          "alias": {
                            "type": "string",
                            "fieldDescription": "\n\nThe name, under which this property will be searchable with JQL.\n\n"
                          },
                          "type": {
                            "enum": [
                              "number",
                              "NUMBER",
                              "text",
                              "TEXT",
                              "string",
                              "STRING",
                              "user",
                              "USER",
                              "date",
                              "DATE"
                            ],
                            "type": "string",
                            "fieldDescription": "\n\nThe type of the referenced value.\n\n The type can be one of the following values:\n\n * `number`, which is indexed as a number and allows the range ordering and searching on this field.\n * `text`, which is tokenized before indexing and allows searching for particular words.\n * `string` which is indexed as is and allows searching for the exact phase only.\n * `user`, which is indexed as a user and allows user-based searching. The expected value is an _account ID_ string (a universal Atlassian user identifier).\n * `date`, which is indexed as a date and allows date range searching and ordering. The expected date format is [YYYY]-[MM]-[DD].\n The expected date time format is [YYYY]-[MM]-[DD]T[hh]:[mm] with optional offset from UTC: +/-[hh]:[mm] or `Z` for no offset.\n For reference, please see [ISO_8601 standard](http://www.w3.org/TR/NOTE-datetime).\n\n"
                          }
                        },
                        "required": [
                          "objectName",
                          "type"
                        ],
                        "shortClassName": "entityPropertyIndexExtractionConfigurationBean",
                        "type": "object",
                        "title": "Property Index",
                        "description": "\n\nDefines an entity property to be indexed by Jira. An entity property is a reference to a JSON object, which also defines it's type.\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"objectName\": \"attachment.size\",\n      \"type\": \"number\",\n      \"alias\": \"attachmentSize\"\n    }\n\n\n"
                      },
                      "type": "array",
                      "fieldDescription": "\n\nThe list with references to values of JSON object which will be indexed and the types of referenced values.\n\n"
                    }
                  },
                  "required": [
                    "propertyKey",
                    "extractions"
                  ],
                  "shortClassName": "entityPropertyIndexKeyConfigurationBean",
                  "type": "object",
                  "title": "Index Key Configuration",
                  "description": "\n\nDefines the list of extractors which index selected JSON objects from defined property.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"extractions\": [\n        {\n          \"objectName\": \"attachment.size\",\n          \"type\": \"number\"\n        }\n      ],\n      \"propertyKey\": \"attachment\"\n    }\n\n\n"
                },
                "type": "array",
                "fieldDescription": "\n\nList of properties from which selected values are indexed.\n\n"
              }
            },
            "required": [
              "name",
              "key"
            ],
            "shortClassName": "entityPropertyModuleBean",
            "type": "object",
            "title": "Entity Property",
            "description": "\n\n<p>Entity properties allow add-ons to add key/value stores to Jira entities, such as issues or projects.\n This module allows you to request those entity properties to be indexed by Jira and able to be queried via JQL searches.\n They are also available in the following conditions:\n <ul>\n     <li><i>entity_property_equal_to</i></li>\n     <li><i>entity_property_equal_to_context</i></li>\n     <li><i>entity_property_contains_any</i></li>\n     <li><i>entity_property_contains_all</i></li>\n     <li><i>entity_property_contains_context</i></li>\n </ul>\n\n <h3>Overview</h3>\n\n <p>The purpose of this module is to specify what data from which entity properties should be extracted and indexed.\n Pretend that an add-on developer has an issue entity property with the key 'attachment' and in that entity property they store the following\n data:</p>\n\n <pre>\n  <code>\n {\n     \"size\": 14231,\n     \"name\": \"new-years-jam\",\n     \"extension\": \"mp3\",\n     \"updated\": \"2016-12-25T20:55:59\"\n }\n  </code>\n </pre>\n\n <p>In this example the developer wants to make the <i>size</i>, <i>extension</i> and <i>updated</i> fields under the <i>attachment</i> key searchable via JQL. To do that they start\n by declaring that the <i>entityType</i> to index will be an 'issue' entity type; this is specified at the top level of their\n module. Then they need to specify which entity property key they wish to extract data from: so they add a single entry\n to <i>keyConfiguratons</i> with <i>propertyKey</i> set to 'attachment'. If there are multiple issue entity properties that an add-on developer wanted\n to index then they could add more <i>keyConfigurations</i> to declare those extra properties. From there the add-on developer specifies\n which data they want to extract from the json value that is stored in this issue entity property. In this example they would\n add three extractions for the <i>size</i>, <i>extension</i> and <i>updated</i> paths under the <i>attachment</i> key, being clear to specify the type\n of data being extracted and what alias should be made available to JQL queries.</p>\n\n <p>It is important to note that array types can be indexed too; the <i>type</i> field in the extraction should be the type of\n each element in the array.</p>\n\n <p>You can see the resultant module definition in the example below.</p>\n\n <p>For more information, please see the <a href=\"../../jira-entity-properties/\">Jira documentation on entity properties</a>.</p>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraEntityProperties\": [\n          {\n            \"keyConfigurations\": [\n              {\n                \"extractions\": [\n                  {\n                    \"objectName\": \"size\",\n                    \"type\": \"number\",\n                    \"alias\": \"attachmentSize\"\n                  },\n                  {\n                    \"objectName\": \"extension\",\n                    \"type\": \"text\",\n                    \"alias\": \"attachmentExtension\"\n                  },\n                  {\n                    \"objectName\": \"updated\",\n                    \"type\": \"date\",\n                    \"alias\": \"attachmentUpdatedDate\"\n                  }\n                ],\n                \"propertyKey\": \"attachment\"\n              }\n            ],\n            \"entityType\": \"issue\",\n            \"name\": {\n              \"value\": \"Attachment Index Document\"\n            },\n            \"key\": \"attachment-entity-property\"\n          }\n        ]\n      }\n    }\n\n\n"
          },
          "type": "array",
          "fieldDescription": "\n\nThe Entity Property are add-on key/value stories in certain Jira objects, such as issues and projects.\n\n"
        },
        "jiraFeatureFlagInfoProvider": {
          "properties": {
            "homeUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nURL to the provider's homepage\n\n"
            },
            "documentationUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nOptional URL to documentation about the provider's Jira integration\n\n"
            },
            "name": {
              "$ref": "#/definitions/i18nProperty",
              "fieldDescription": "\n\nA human readable name.\n\n"
            },
            "actions": {
              "$ref": "#/definitions/featureFlagProviderActionsBean",
              "fieldDescription": "\n\nOptional actions that can be performed by Jira users, e.g., link an existing flag, create a new flag, etc.\n\n"
            },
            "logoUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nOptional URL to the provider's logo, which will be displayed in the UI\n\n"
            },
            "key": {
              "pattern": "^[a-zA-Z0-9-]+$",
              "type": "string",
              "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
            }
          },
          "required": [
            "homeUrl",
            "name",
            "key"
          ],
          "shortClassName": "featureFlagInfoProviderModuleBean",
          "type": "object",
          "title": "Feature Flag",
          "description": "\n\n<p>This module allows third-party providers to send feature flag information to Jira and associate it with an issue.</p>\n<p>Supplied feature flag information will be presented in the right sidebar of the\n <a href=\"https://confluence.atlassian.com/jiracorecloud/the-new-jira-issue-view-938040503.html\">new Jira issue view</a> under Releases.</p>\n<p>This module also provides actions, which allow users to create or link existing feature flags to Jira issues.</p>\n\n<p>Feature flag information is written/deleted via REST. This API is part of the <a href=\"https://developer.atlassian.com/cloud/jira/software/rest/\">Jira Software REST documentation</a>.</p>\n\n<p>Note that the module key and name are not considered <a href=\"https://www.atlassian.com/legal/privacy-policy\">private</a> and should therefore not contain any sensitive or personally identifiable information.</p>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraFeatureFlagInfoProvider\": {\n          \"homeUrl\": \"https://myfeatureflagprovider.com\",\n          \"logoUrl\": \"https://myfeatureflagprovider.com/images/logo.svg\",\n          \"documentationUrl\": \"https://myfeatureflagprovider.com/docs/jira-integration\",\n          \"actions\": {\n            \"createFlag\": {\n              \"templateUrl\": \"https://myfeatureflagprovider.com/integration/jira/create?issueKey={issue.key}\"\n            },\n            \"linkFlag\": {\n              \"templateUrl\": \"https://myfeatureflagprovider.com/integration/jira/link?issueKey={issue.key}\"\n            },\n            \"listFlags\": {\n              \"templateUrl\": \"https://myfeatureflagprovider.com/integration/jira/flags?issueKey={issue.key}\"\n            }\n          },\n          \"name\": {\n            \"value\": \"My Feature Flag Provider\"\n          },\n          \"key\": \"featureflag-integration\"\n        }\n      }\n    }\n\n\n",
          "fieldDescription": "\n\nDeclare that this add-on provides feature flag information\n\n"
        },
        "jiraProjectPermissions": {
          "items": {
            "properties": {
              "name": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nA human readable name.\n\n"
              },
              "description": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nDescription of the project permission. It will be displayed under the permission's name.\n\n"
              },
              "category": {
                "enum": [
                  "projects",
                  "PROJECTS",
                  "issues",
                  "ISSUES",
                  "voters_and_watchers",
                  "VOTERS_AND_WATCHERS",
                  "comments",
                  "COMMENTS",
                  "attachments",
                  "ATTACHMENTS",
                  "time_tracking",
                  "TIME_TRACKING",
                  "other",
                  "OTHER"
                ],
                "type": "string",
                "fieldDescription": "\n\nThe category of the project permission. This determines in which section the permission will be displayed.\n\n",
                "defaultValue": "other"
              },
              "conditions": {
                "items": {
                  "type": "object",
                  "anyOf": [
                    {
                      "$ref": "#/definitions/compositeCondition"
                    },
                    {
                      "$ref": "#/definitions/singleCondition"
                    }
                  ]
                },
                "type": "array",
                "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
              },
              "key": {
                "pattern": "^[a-zA-Z0-9-]+$",
                "type": "string",
                "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
              }
            },
            "required": [
              "name",
              "description",
              "key"
            ],
            "shortClassName": "projectPermissionModuleBean",
            "type": "object",
            "title": "Project Permission",
            "description": "\n\nThis module allows add-ons to define custom project permissions.\n\n Project permissions are scoped to projects and are useful if you need to manage permissions\n for operations performed on objects related to projects, like issues, comments, worklogs\n or your add-on's project-scoped entities.\n\n A custom project permission behaves as any other Jira permission.\n Administrators may manage it in the UI, and your add-on can access it through REST APIs.\n Permissions you define in your add-on can be used in the `has_project_permission` [condition](../../conditions/).\n\n Note that there is a similar module for [global permissions](../global-permission/).\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraProjectPermissions\": [\n          {\n            \"description\": {\n              \"value\": \"Custom project permission for attachments\"\n            },\n            \"category\": \"attachments\",\n            \"name\": {\n              \"value\": \"My Project Permission\"\n            },\n            \"key\": \"my-project-permission\"\n          }\n        ]\n      }\n    }\n\n\n"
          },
          "type": "array",
          "fieldDescription": "\n\nAdd project permission to Jira.\n\n"
        },
        "jiraDeploymentInfoProvider": {
          "properties": {
            "homeUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nURL to the provider's homepage\n\n"
            },
            "documentationUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nOptional URL to documentation about the provider's Jira integration\n\n"
            },
            "name": {
              "$ref": "#/definitions/i18nProperty",
              "fieldDescription": "\n\nA human readable name.\n\n"
            },
            "actions": {
              "properties": {
                "listDeployments": {
                  "properties": {
                    "templateUrl": {
                      "format": "uri-template",
                      "type": "string",
                      "fieldDescription": "\n\n"
                    }
                  },
                  "required": [
                    "templateUrl"
                  ],
                  "shortClassName": "deploymentProviderActionBean",
                  "type": "object",
                  "description": "\n\n<p>Defines the URL template that is used when an action is invoked. The following context parameters are supported: <code>{issue.key}</code>, <code>{issue.summary}</code>, <code>{issue.deployments}</code>.</p>\n\n",
                  "fieldDescription": "\n\nAction for showing all linked deployments, when there are multiple deployments linked to a Jira issue.\n\n"
                }
              },
              "shortClassName": "deploymentProviderAllActionsBean",
              "type": "object",
              "description": "\n\n<p>Deployment actions that can be performed by Jira users.</p>\n<p>Each action is optional (unless indicated otherwise). The absence of an action indicates that the action is not supported by the provider.</p>\n\n",
              "fieldDescription": "\n\nOptional actions that can be performed by Jira users, e.g., list all deployments associated with the issue.\n\n"
            },
            "logoUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nOptional URL to the provider's logo, which will be displayed in the UI\n\n"
            },
            "key": {
              "pattern": "^[a-zA-Z0-9-]+$",
              "type": "string",
              "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
            }
          },
          "required": [
            "homeUrl",
            "name",
            "key"
          ],
          "shortClassName": "deploymentInfoProviderModuleBean",
          "type": "object",
          "title": "Deployment",
          "description": "\n\n<p>This module allows third-party providers to send deployment information to Jira and associate it with an issue.</p>\n<p>Supplied deployment information will be presented in the right sidebar of the\n <a href=\"https://confluence.atlassian.com/jiracorecloud/the-new-jira-issue-view-938040503.html\">new Jira issue view</a> under Releases.</p>\n<p>This module also provides actions, for example, allowing users to list all existing deployments.</p>\n\n<p>Deployment information is written and deleted via REST. This API is part of the <a href=\"https://developer.atlassian.com/cloud/jira/software/rest/\">Jira Software REST documentation</a>.</p>\n\n<p>Note that the module key and name are not <a href=\"https://www.atlassian.com/legal/privacy-policy\">private</a> and therefore should not contain any sensitive or personally identifiable information.</p>\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraDeploymentInfoProvider\": {\n          \"homeUrl\": \"https://mydeploymentrovider.com\",\n          \"logoUrl\": \"https://mydeploymentprovider.com/images/logo.svg\",\n          \"documentationUrl\": \"https://mydeploymentprovider.com/docs/jira-integration\",\n          \"actions\": {\n            \"listDeployments\": {\n              \"templateUrl\": \"https://mydeploymentprovider.com/integration/jira/deployments?issueKey={issue.key}\"\n            }\n          },\n          \"name\": {\n            \"value\": \"My Deployment Provider\"\n          },\n          \"key\": \"deployment-integration\"\n        }\n      }\n    }\n\n\n",
          "fieldDescription": "\n\nDeclare that this add-on provides deployment information\n\n"
        },
        "jiraReports": {
          "items": {
            "$ref": "#/definitions/report"
          },
          "type": "array",
          "fieldDescription": "\n\nAdd new report modules to Jira projects.\n\n"
        },
        "jiraProjectPages": {
          "items": {
            "properties": {
              "name": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nA human readable name.\n\n"
              },
              "weight": {
                "type": "integer",
                "fieldDescription": "\n\nSpecifies the ordering of the link in the project sidebar.\n\n <p>The \"lightest\" weight (i.e., lowest number) appears first, rising relative to other items, while the \"heaviest\"\n weights sink to the bottom of the menu or list.</p>\n\n",
                "defaultValue": "100"
              },
              "iconUrl": {
                "format": "uri",
                "type": "string",
                "fieldDescription": "\n\nSpecifies an icon URL that will displayed alongside the link to the project page in the project sidebar.\n\n The icon resource provided in this field should be larger or equals to 16x16 pixels.<br>\n\n"
              },
              "conditions": {
                "items": {
                  "type": "object",
                  "anyOf": [
                    {
                      "$ref": "#/definitions/singleCondition"
                    },
                    {
                      "$ref": "#/definitions/compositeCondition"
                    }
                  ]
                },
                "type": "array",
                "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
              },
              "url": {
                "format": "uri-template",
                "type": "string",
                "fieldDescription": "\n\nSpecifies the URL targeted by the page. The URL is relative to the add-on's base URL.\n\n"
              },
              "key": {
                "pattern": "^[a-zA-Z0-9-]+$",
                "type": "string",
                "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
              }
            },
            "required": [
              "name",
              "url",
              "key"
            ],
            "additionalProperties": true,
            "shortClassName": "projectPageModuleBean",
            "type": "object",
            "title": "Project Page",
            "description": "\n\nThis module represents a page with a project sidebar.\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraProjectPages\": [\n          {\n            \"url\": \"/iframe-content-url?projectId=${project.id}\",\n            \"iconUrl\": \"/logo-url-or-inline-svg\",\n            \"weight\": 100,\n            \"name\": {\n              \"value\": \"My Project Page\"\n            },\n            \"key\": \"my-project-page\"\n          }\n        ]\n      }\n    }\n\n\n"
          },
          "type": "array",
          "fieldDescription": "\n\nAdd project pages to Jira\n\n"
        },
        "jiraSearchRequestViews": {
          "items": {
            "$ref": "#/definitions/searchRequestView"
          },
          "type": "array",
          "fieldDescription": "\n\nThe Search Request View is used to display different representations of search results in the issue navigator.\n They will be displayed as a link in the `Export` toolbar menu.\n\n"
        },
        "jiraDashboardItems": {
          "items": {
            "properties": {
              "name": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nA human readable name.\n\n"
              },
              "description": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nDescription of the dashboard item. This will be displayed for a user in the directory.\n\n"
              },
              "conditions": {
                "items": {
                  "type": "object",
                  "anyOf": [
                    {
                      "$ref": "#/definitions/compositeCondition"
                    },
                    {
                      "$ref": "#/definitions/singleCondition"
                    }
                  ]
                },
                "type": "array",
                "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
              },
              "url": {
                "format": "uri-template",
                "type": "string",
                "fieldDescription": "\n\nThe URL of the service which will render the dashboard item. Following context parameters are supported in\n url.\n\n * `dashboard.id` unique id of the dashboard on which the item is rendered. This parameter is passed only on default view\n * `dashboardItem.id` unique id of the dashboard item which is rendered. This parameter is passed only on default view\n * `dashboardItem.key` key of the dashboard item. This parameter is passed in both: default and directory view\n * `dashboardItem.viewType` type of the view in which dashboard item is displayed. Default (for dashboard) and directory. This list may be extended\n\n"
              },
              "configurable": {
                "type": "boolean",
                "fieldDescription": "\n\nSpecify if the dashboard-item is configurable or not. Configurable dashboard items should render configuration\n view if there is no configuration stored for the dashboard item. [Dashboard item properties](../../jira-rest-api-scopes/) can\n be used for configuration storage.\n\n In addition, configurable dashboard items should register a javascript callback for `edit click`.\n\n     AP.require(['jira'], function (jira) {\n        jira.DashboardItem.onDashboardItemEdit(function() {\n           // render dashboard item configuration now\n        });\n     });\n\n It is a common case to give users ability to set the name of the dashboard item. This can be achieved with a following\n JS code:\n\n     AP.require(['jira'], function(jira) {\n        jira.setDashboardItemTitle(\"Setting title works\");\n     });\n\n",
                "defaultValue": "false"
              },
              "key": {
                "pattern": "^[a-zA-Z0-9-]+$",
                "type": "string",
                "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
              },
              "thumbnailUrl": {
                "format": "uri-template",
                "type": "string",
                "fieldDescription": "\n\nURI of the dashboard item thumbnail which is displayed in the directory.\n\n"
              }
            },
            "required": [
              "name",
              "description",
              "url",
              "key",
              "thumbnailUrl"
            ],
            "shortClassName": "dashboardItemModuleBean",
            "type": "object",
            "title": "Dashboard Item",
            "description": "\n\nDashboard items allow add-on to display a summary information data on the dashboard. Each dashboard-item can be configured\n to display information relevant to a particular user.\n\n <h2>Example</h2>\n For a full add-on example, see [dashboard item example add-on](https://bitbucket.org/atlassianlabs/atlassian-connect-jira-dashboard-item-example).\n\n\n\n\n\n    {\n      \"jiraDashboardItems\": [\n        {\n          \"description\": {\n            \"value\": \"Dashboard item description\"\n          },\n          \"url\": \"/dashboard-item-test?dashboardItemId={dashboardItem.id}&dashboardId={dashboard.id}&view={dashboardItem.viewType}\",\n          \"configurable\": true,\n          \"thumbnailUrl\": \"atlassian-icon-16.png\",\n          \"name\": {\n            \"value\": \"Dashboard item title\"\n          },\n          \"key\": \"dashboard-item-key\"\n        }\n      ]\n    }\n\n\n"
          },
          "type": "array",
          "fieldDescription": "\n\nAdd new dashboard item to Jira.\n\n"
        },
        "jiraWorkflowPostFunctions": {
          "items": {
            "$ref": "#/definitions/workflowPostFunction"
          },
          "type": "array",
          "fieldDescription": "\n\nWorkflow post functions execute after the workflow transition is executed.\n\n"
        },
        "jiraIssueGlances": {
          "items": {
            "$ref": "#/definitions/issueGlance"
          },
          "type": "array",
          "fieldDescription": "\n\nAdd issue glances to Jira.\n\n"
        },
        "jiraIssueContents": {
          "items": {
            "$ref": "#/definitions/issueContent"
          },
          "type": "array",
          "fieldDescription": "\n\nAdd issue Contents to Jira.\n\n"
        },
        "jiraDevelopmentTool": {
          "properties": {
            "capabilities": {
              "items": {
                "enum": [
                  "commit",
                  "COMMIT",
                  "branch",
                  "BRANCH",
                  "pull_request",
                  "PULL_REQUEST"
                ],
                "type": "string"
              },
              "type": "array",
              "fieldDescription": "\n\nWhat development information the tool offers\n\n"
            },
            "application": {
              "$ref": "#/definitions/i18nProperty",
              "fieldDescription": "\n\nThe application behind this development tool\n\n"
            },
            "name": {
              "$ref": "#/definitions/i18nProperty",
              "fieldDescription": "\n\nA human readable name.\n\n"
            },
            "actions": {
              "$ref": "#/definitions/developmentToolModuleActionsBean",
              "fieldDescription": "\n\nOptional actions that can be performed by Jira users, e.g., create branch, etc.\n\n"
            },
            "url": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nA URL to the development tool\n\n"
            },
            "logoUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nThe logo for the development tool, will be displayed in an area 16 by 16 pixels\n\n"
            },
            "key": {
              "pattern": "^[a-zA-Z0-9-]+$",
              "type": "string",
              "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
            }
          },
          "required": [
            "capabilities",
            "application",
            "name",
            "url",
            "logoUrl",
            "key"
          ],
          "additionalProperties": true,
          "shortClassName": "developmentToolModuleBean",
          "type": "object",
          "title": "Development Tool",
          "description": "\n\nThe Development Tool module allows an app to send Development Information to JIRA. This development information will be\n displayed in the development information panel when an issue is viewed.\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraDevelopmentTool\": {\n          \"url\": \"https://bitbucket.org\",\n          \"application\": {\n            \"value\": \"Bitbucket\"\n          },\n          \"logoUrl\": \"https://www.atlassian.com/dam/jcr:bd56917e-e361-4f03-b672-9f5ef5b06e80/Bitbucket-blue.svg\",\n          \"capabilities\": [\n            \"commit\"\n          ],\n          \"name\": {\n            \"value\": \"Bitbucket\"\n          },\n          \"key\": \"bitbucket-integration\"\n        }\n      }\n    }\n\n\n",
          "fieldDescription": "\n\nDeclare that this add-on provides a development tool integration\n\n"
        },
        "jiraProjectTabPanels": {
          "items": {
            "$ref": "#/definitions/tabPanel"
          },
          "type": "array",
          "fieldDescription": "\n\nThe Project Tab Panel module allows you to add new panels to the 'Project' page.\n\n"
        },
        "jiraGlobalPermissions": {
          "items": {
            "properties": {
              "defaultGrants": {
                "items": {
                  "enum": [
                    "none",
                    "NONE",
                    "jira-administrators",
                    "JIRA-ADMINISTRATORS",
                    "all",
                    "ALL"
                  ],
                  "type": "string"
                },
                "type": "array",
                "fieldDescription": "\n\nSpecifies group of users that will be granted this permissions when the add-on is first installed.\n\n Allowed values:\n\n  * `NONE` - Permission will not be granted to anyone by default\n  * `ALL`  -  If `anonymousAllowed` is set to true, every user, both logged in and anonymous, will be granted the permission.\n            Otherwise, permission will be granted to every user with application role assigned.\n  * `JIRA-ADMINISTRATORS` - Every user with jira administration permission will be granted this permission.\n\n"
              },
              "name": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nA human readable name.\n\n"
              },
              "description": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nDescription of the global permission. It will be displayed under the permission's name.\n\n"
              },
              "anonymousAllowed": {
                "type": "boolean",
                "fieldDescription": "\n\nSpecifies if this permission can be granted to anonymous users.\n\n",
                "defaultValue": "true"
              },
              "key": {
                "pattern": "^[a-zA-Z0-9-]+$",
                "type": "string",
                "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
              }
            },
            "required": [
              "name",
              "description",
              "key"
            ],
            "shortClassName": "globalPermissionModuleBean",
            "type": "object",
            "title": "Global Permission",
            "description": "\n\nThis module allows add-ons to define custom global permissions.\n\n Global permissions are not related to any particular entity\n and are useful if you need to manage permissions for operations performed on global objects,\n like users or global settings.\n\n A custom global permission behaves as any other Jira permission.\n Administrators may manage it in the UI, and your add-on can access it through REST APIs.\n Permissions you define in your add-on can be used in the `has_global_permission` [condition](../../conditions/).\n\n Note that there is a similar module for [project permissions](../project-permission/).\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraGlobalPermissions\": [\n          {\n            \"description\": {\n              \"value\": \"Custom global permission for my add-on\"\n            },\n            \"anonymousAllowed\": false,\n            \"defaultGrants\": [\n              \"all\"\n            ],\n            \"name\": {\n              \"value\": \"My Global Permission\"\n            },\n            \"key\": \"my-global-permission\"\n          }\n        ]\n      }\n    }\n\n\n"
          },
          "type": "array",
          "fieldDescription": "\n\nAdd global permission to Jira.\n\n"
        },
        "jiraIssueFields": {
          "items": {
            "properties": {
              "template": {
                "properties": {
                  "type": {
                    "enum": [
                      "link",
                      "LINK"
                    ],
                    "type": "string",
                    "fieldDescription": "\n\nType of the template.\n\n"
                  },
                  "url": {
                    "type": "string",
                    "fieldDescription": "\n\n<p>\n     If the type is 'link' then this specifies the URL template for the link.\n     It is possible to use <a href=\"../../context-parameters/\">context parameters</a> in the template.\n </p>\n\n <p>\n     The URL may be relative or absolute. If it is the former, then the Jira context path will be prepended automatically.\n </p>\n\n <p>\n     The following context parameters are available:\n     <ul>\n         <li>option.id, option.key, option.properties</li>\n         <li>issue.id, issue.key</li>\n         <li>project.id, project.key</li>\n         <li>user.id (deprecated), user.name (deprecated), user.accountId</li>\n     </ul>\n\n"
                  }
                },
                "required": [
                  "type",
                  "url"
                ],
                "shortClassName": "issueFieldTemplateBean",
                "type": "object",
                "title": "Issue Field Template",
                "description": "\n\nDefines the template used to render issue field options in the UI view.\n\n",
                "fieldDescription": "\n\nThe template used to render options. This is only valid when the `type` is `single_select` or `multi_select`.\n\n"
              },
              "name": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nA human readable name.\n\n"
              },
              "description": {
                "$ref": "#/definitions/i18nProperty",
                "fieldDescription": "\n\nDescription of the issue field. This will be displayed for the user under the field in the create or edit issue view.\n\n"
              },
              "type": {
                "enum": [
                  "string",
                  "STRING",
                  "text",
                  "TEXT",
                  "single_select",
                  "SINGLE_SELECT",
                  "multi_select",
                  "MULTI_SELECT",
                  "number",
                  "NUMBER"
                ],
                "type": "string",
                "fieldDescription": "\n\nType of the issue field. String type differs from text type on the allowed operators. For string = is used.\n Text type uses the ~ operator.\n\n"
              },
              "extractions": {
                "items": {
                  "properties": {
                    "path": {
                      "type": "string",
                      "fieldDescription": "\n\nThe path to the JSON data which is supposed to be indexed.\n\n For instance, for JSON <code>\"{\"label\": {\"color\": \"red\", \"text\":\"connect\"}}</code> the valid path\n referencing the color is label.color.\n\n Currently, specifying of index for JSON arrays and first level JSON (such as \"true\") is not supported.\n The JSON needs to be an object with properties.\n\n"
                    },
                    "name": {
                      "type": "string",
                      "fieldDescription": "\n\nThe name, under which this property will be searchable with JQL. If not given, the <pre>path</pre> will be used.\n For a field with name Field Name, and an extraction with name ExtractionName the resulting query string will be\n \"Field Name\".ExtractionName.\n\n"
                    },
                    "type": {
                      "enum": [
                        "number",
                        "NUMBER",
                        "text",
                        "TEXT",
                        "string",
                        "STRING",
                        "user",
                        "USER",
                        "date",
                        "DATE"
                      ],
                      "type": "string",
                      "fieldDescription": "\n\nThe type of the referenced value.\n\n The type can be one of the following values:\n\n * `number`, which is indexed as a number and allows the range ordering and searching on this field.\n * `text`, which is tokenized before indexing and allows searching for particular words.\n * `string` which is indexed as is and allows searching for the exact phase only.\n * `user`, which is indexed as a user and allows user-based searching. The expected value is an _account ID_ string (a universal Atlassian user identifier).\n * `date`, which is indexed as a date and allows date range searching and ordering. The expected date format is [YYYY]-[MM]-[DD].\n The expected date time format is [YYYY]-[MM]-[DD]T[hh]:[mm] with optional offset from UTC: +/-[hh]:[mm] or `Z` for no offset.\n For reference, please see [ISO_8601 standard](http://www.w3.org/TR/NOTE-datetime).\n\n"
                    }
                  },
                  "required": [
                    "path",
                    "type"
                  ],
                  "shortClassName": "issueFieldValueExtractionBean",
                  "type": "object",
                  "title": "Issue Field Option Property Index",
                  "description": "\n\nDefines an issue field option property to be indexed by Jira. An option can contain an additional properties object.\n In this bean, you can define which properties will be extracted, so that a user will be able to search for issues which have options set that have a certain property.\n\n <p>\n     Note that `multi_select` fields may have more than one option selected. In that case, properties from all options\n     are indexed. Each Option's properties should have the same structure to be indexed properly, i.e. the types of values\n     across all options' properties should not differ. If they do, Jira will still try to act smart and do the most reasonable thing,\n     but the results are not guaranteed.\n </p>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"path\": \"category\",\n      \"type\": \"text\",\n      \"name\": \"categoryName\"\n    }\n\n\n"
                },
                "type": "array",
                "fieldDescription": "\n\nExtractions used for JQL search. This is valid only when the `type` is `single_select` or `multi_select`.\n\n"
              },
              "key": {
                "pattern": "^[a-zA-Z0-9-]+$",
                "type": "string",
                "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
              }
            },
            "required": [
              "name",
              "description",
              "type",
              "key"
            ],
            "shortClassName": "issueFieldModuleBean",
            "type": "object",
            "title": "Issue Field",
            "description": "\n\n<p>\n Issue field module allows the add-on to add a new field in Jira that will be visible in the issue view.\n It can be added to any screen just like any other field. It can be referenced in the REST API by $(add-on-key)__$(field-key).\n For fields of single-select type you additionally need to populate the field with the allowed values.\n See the <a href=\"https://docs.atlassian.com/jira/REST/cloud/#api/2/field/%7BfieldKey%7D/option\">REST API for issue field options</a>.\n </p>\n <h2>Example</h2>\n For a full add-on example, see <a href=\"https://bitbucket.org/atlassianlabs/jira-issue-field-demo\">issue field example add-on</a>.\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraIssueFields\": [\n          {\n            \"description\": {\n              \"value\": \"field with team\"\n            },\n            \"type\": \"single_select\",\n            \"extractions\": [\n              {\n                \"path\": \"category\",\n                \"type\": \"text\",\n                \"name\": \"categoryName\"\n              }\n            ],\n            \"name\": {\n              \"value\": \"Team\"\n            },\n            \"key\": \"team-field\"\n          }\n        ]\n      }\n    }\n\n\n"
          },
          "type": "array",
          "fieldDescription": "\n\nAdd issue field to Jira\n\n"
        },
        "jiraIssueTabPanels": {
          "items": {
            "$ref": "#/definitions/tabPanel"
          },
          "type": "array",
          "fieldDescription": "\n\nThe Issue Tab Panel module allows you to add new tabs to the 'Browse Component' page.\n\n"
        },
        "jiraBuildInfoProvider": {
          "properties": {
            "homeUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nURL to the provider's homepage\n\n"
            },
            "documentationUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nOptional URL to documentation about the provider's Jira integration\n\n"
            },
            "name": {
              "$ref": "#/definitions/i18nProperty",
              "fieldDescription": "\n\nA human readable name.\n\n"
            },
            "actions": {
              "properties": {},
              "shortClassName": "buildProviderAllActionsBean",
              "type": "object",
              "description": "\n\n<p>Build actions that can be performed by Jira users.</p>\n <p>Currently there are no actions defined for build providers. Please contact us if you need any.</p>\n\n",
              "fieldDescription": "\n\nOptional actions that can be performed by Jira users\n\n"
            },
            "logoUrl": {
              "format": "uri",
              "type": "string",
              "fieldDescription": "\n\nOptional URL to the provider's logo, which will be displayed in the UI\n\n"
            },
            "key": {
              "pattern": "^[a-zA-Z0-9-]+$",
              "type": "string",
              "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
            }
          },
          "required": [
            "homeUrl",
            "name",
            "key"
          ],
          "shortClassName": "buildInfoProviderModuleBean",
          "type": "object",
          "title": "Build",
          "description": "\n\n<p>This module allows third-party providers to send build information to Jira and associate it with issues.</p>\n <p>Supplied build information will be presented in the\n <a href=\"https://confluence.atlassian.com/jirasoftwarecloud/viewing-the-development-information-for-an-issue-777002795.html\">development panel</a>.</p>\n <p>\n <p>Build information is written and deleted via REST. This API is part of the <a href=\"https://developer.atlassian.com/cloud/jira/software/rest/\">Jira Software REST documentation</a>.</p>\n <p>\n <p>Note that the module key and name are not <a href=\"https://www.atlassian.com/legal/privacy-policy\">private</a> and therefore should not contain any sensitive or personally identifiable information.</p>\n <p>\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraBuildInfoProvider\": {\n          \"homeUrl\": \"https://mybuildrovider.com\",\n          \"logoUrl\": \"https://mybuildprovider.com/images/logo.svg\",\n          \"documentationUrl\": \"https://mybuildprovider.com/docs/jira-integration\",\n          \"actions\": {},\n          \"name\": {\n            \"value\": \"My Build Provider\"\n          },\n          \"key\": \"build-integration\"\n        }\n      }\n    }\n\n\n",
          "fieldDescription": "\n\nDeclare that this add-on provides build information\n\n"
        },
        "jiraWorkflowConditions": {
          "items": {
            "$ref": "#/definitions/workflowCondition"
          },
          "type": "array",
          "fieldDescription": "\n\nWorkflow conditions control if the workflow transition is available.\n\n"
        },
        "jiraProjectAdminTabPanels": {
          "items": {
            "$ref": "#/definitions/projectAdminTabPanel"
          },
          "type": "array",
          "fieldDescription": "\n\nThe Project Admin Tab Panel module allows you to add new panels to the 'Project Admin' page.\n\n"
        },
        "jiraWorkflowValidators": {
          "items": {
            "$ref": "#/definitions/workflowValidator"
          },
          "type": "array",
          "fieldDescription": "\n\nWorkflow validators check if the issue is allowed to be transitioned in its final state.\n\n"
        },
        "jiraTimeTrackingProviders": {
          "items": {
            "$ref": "#/definitions/jiraTimeTrackingProviders"
          },
          "type": "array",
          "fieldDescription": "\n\nDeclare that this add-on provides time tracking functionality\n\n"
        }
      }
    },
    "lifecycle": {
      "properties": {
        "installed": {
          "format": "uri",
          "type": "string",
          "fieldDescription": "\n\nWhen a Connect add-on is installed, a synchronous request is fired to this URL to initiate the installation\n handshake. In order to successfully complete installation, the add-on must respond with either a\n <code>200 OK</code> or <code>204 No Content</code> status.\n\n<div class=\"aui-message warning\">\n    <p class=\"title\">\n        <span class=\"aui-icon icon-warning\">Warning</span>\n        <strong>Important</strong>\n    </p>\n    Upon successful registration, the add-on must return either a <code>200 OK</code> or <code>204 No Content</code>\n    response code, otherwise the operation will fail and the installation will be marked as incomplete.\n</div>\n\n"
        },
        "disabled": {
          "format": "uri",
          "type": "string",
          "fieldDescription": "\n\nFires when an add on has been successfully disabled. This is an asynchronous notification event.\n\n"
        },
        "uninstalled": {
          "format": "uri",
          "type": "string",
          "fieldDescription": "\n\nFires when an add on has been successfully un-installed. This is an asynchronous notification event.\n\n"
        },
        "enabled": {
          "format": "uri",
          "type": "string",
          "fieldDescription": "\n\nFires when an add on has been successfully enabled. This is an asynchronous notification event.\n\n"
        }
      },
      "shortClassName": "lifecycleBean",
      "type": "object",
      "title": "Lifecycle",
      "description": "\n\nAllows an add-on to register callbacks for events that occur in the lifecycle of an installation. When a lifecycle\n event is fired, a POST request will be made to the appropriate URL registered for the event.\n\n The <a href=\"#installed\"><code>installed</code></a> lifecycle callback is an integral part of the installation process\n of an add-on, whereas the remaining lifecycle events are essentially <a href=\"../modules/webhook/\">webhooks</a>.\n\n Each property in this object is a URL relative to the add-on's base URL.\n\n <h2>Lifecycle attribute example</h2>\n\n\n\n\n\n    {\n      \"installed\": \"/installed\",\n      \"uninstalled\": \"/uninstalled\",\n      \"enabled\": \"/enabled\",\n      \"disabled\": \"/disabled\"\n    }\n\n\n\n\n <h2>Lifecycle HTTP request payload</h2>\n Lifecycle callbacks contain a JSON data payload with important tenant information that you will need to store in your\n add-on in order to sign and verify future requests. The payload contains the following attributes:\n\n\n\n\n\n    {\n      \"key\": \"installed-addon-key\",\n      \"clientKey\": \"unique-client-identifier\",\n      \"sharedSecret\": \"a-secret-key-not-to-be-lost\",\n      \"serverVersion\": \"server-version\",\n      \"pluginsVersion\": \"version-of-connect\",\n      \"baseUrl\": \"http://example.atlassian.net\",\n      \"productType\": \"jira\",\n      \"description\": \"Atlassian Jira at https://example.atlassian.net\",\n      \"serviceEntitlementNumber\": \"SEN-number\",\n      \"eventType\": \"installed\"\n    }\n\n\n\n\n<table summary=\"Lifecycle payload attributes\" class='aui'>\n    <thead>\n        <tr>\n            <th>Attribute</th>\n            <th>Description</th>\n        </tr>\n    </thead>\n    <tr>\n        <td><code>key</code></td>\n        <td>Add-on key that was installed into the Atlassian Product, as it appears in your add-on's descriptor.</td>\n    </tr>\n    <tr>\n        <td><code>clientKey</code></td>\n        <td>Identifying key for the Atlassian product instance that the add-on was installed into. This will never change for a given\n        instance, and is unique across all Atlassian product tenants. This value should be used to key tenant details\n        in your add-on. The one time the clientKey can change is when a backup taken from a different instance is restored onto the instance.\n        Determining the contract between the instance and add-on in this situation is tracked by\n        <a href=\"https://ecosystem.atlassian.net/browse/AC-1528\">AC-1528</a> in the Connect backlog.</td>\n    </tr>\n    <tr>\n        <td><code>sharedSecret</code></td>\n        <td>Use this string to sign outgoing JWT tokens and validate incoming JWT tokens. Optional: and may not\n        be present on non-JWT add-on installations, and is only sent on the <code>installed</code> event.</td>\n    </tr>\n    <tr>\n        <td><code>serverVersion</code></td>\n        <td>This is a string representation of the host product's version. Generally you should not need it.</td>\n    </tr>\n    <tr>\n        <td><code>pluginsVersion</code></td>\n        <td>This is a semver compliant version of Atlassian Connect which is running on the host server, for example: <code>1.1.15</code>.</td>\n    </tr>\n    <tr>\n        <td><code>baseUrl</code></td>\n        <td>URL prefix for this Atlassian product instance. All of its REST endpoints begin with this `baseUrl`.</td>\n    </tr>\n    <tr>\n        <td><code>productType</code></td>\n        <td>Identifies the category of Atlassian product, e.g. <code>jira</code> or <code>confluence</code>.</td>\n    </tr>\n    <tr>\n        <td><code>description</code></td>\n        <td>The host product description - this is customisable by an instance administrator.</td>\n    </tr>\n    <tr>\n        <td><code>serviceEntitlementNumber</code>\n        (optional)</td>\n        <td>Also known as the SEN, the service entitlement number is the add-on license id. This attribute will only be included\n        during installation of a paid add-on.</td>\n    </tr>\n      <tr>\n        <td><code>oauthClientId</code></td>\n        <td>The OAuth 2.0 client ID for your add-on. For more information, see <a href=\"../oauth-2-jwt-bearer-tokens-for-add-ons/\">OAuth 2.0 - JWT Bearer token authorization grant type</a> </td>\n    </tr>\n</table>\n\n <h2>Request query parameters</h2>\n\n <p>When this payload information is POSTed to your Atlassian Connect service you may receive the <code>user\\_key</code> and <code>user\\_id</code>\n query parameters; these query parameters are both deprecated. <span class=\"aui-lozenge aui-lozenge-current\">Deprecated</span>\n If you wish to find out which user enabled your add-on then you should extract the <code>context.user.userKey</code> or <code>context.user.userName</code>\n data from the JWT token on the enabled lifecycle event.</p>\n\n",
      "fieldDescription": "\n\nAllows the add on to register for plugin lifecycle notifications\n\n"
    },
    "lastUpdated": {
      "properties": {},
      "shortClassName": "date",
      "type": "object",
      "fieldDescription": "\n\n"
    },
    "baseUrl": {
      "pattern": "^((https|http):\\/\\/.+|)$",
      "maxLength": 200,
      "format": "uri",
      "type": "string",
      "fieldDescription": "\n\nThe base url of the remote add-on, which is used for all communications back to the add-on instance. Once the add-on is installed in a product, the add-on's baseUrl\n cannot be changed without first uninstalling the add-on or upgrading to a new version. This is important; choose your baseUrl wisely before making your add-on public.\n\n The baseUrl must start with ``https://`` to ensure that all data is sent securely between our [cloud instances](../../understanding-jwt/)\n and your add-on.\n\n Note: each add-on must have a unique baseUrl. If you would like to serve multiple add-ons from the same host, consider adding a path prefix into the baseUrl.\n\n"
    },
    "apiMigrations": {
      "properties": {
        "gdpr": {
          "type": "boolean",
          "fieldDescription": "\n\nEnables the use of GDPR-compliant JWTs and iframe URLs.\n\n",
          "defaultValue": "false"
        }
      },
      "additionalProperties": false,
      "shortClassName": "apiMigrationsBean",
      "type": "object",
      "title": "Api Migrations",
      "description": "\n\nAllows an add-on to opt-into an active api migration.\n\n Goal of this feature is to support API changes that could not be made backward compatible.\n Such changes will break existing apps that do not yet support new API version.\n The opt-in mechanism allows app vendors to communicate to host product what API changes they support.\n\n <p>See <a href=\"../connect-active-api-migrations/\">active migrations page</a> for the list of currently active API migrations.</p>\n\n\n\n\n\n    {\"apiMigrations\":{\"gdpr\":true}}\n\n\n\n\n For more info about this feature see <a href=\"../connect-api-migration/\">API migration Opt-in documentation</a>.\n\n",
      "fieldDescription": "\n\nThe flags for the apiMigrations that this addon has opted into.\n\n"
    },
    "apiVersion": {
      "type": "integer",
      "fieldDescription": "\n\nThe API version is an OPTIONAL integer. If omitted we will infer an API version of 1.\n\n The intention behind the API version is to allow vendors the ability to beta test a major revision to their Connect add-on as a private version,\n and have a seamless transition for those beta customers (and existing customers) once the major revision is launched.\n\n Vendors can accomplish this by listing a new private version of their add-on, with a new descriptor hosted at a new URL.\n\n They use the Atlassian Marketplace's access token facilities to share this version with customers (or for internal use).\n When this version is ready to be taken live, it can be transitioned from private to public, and all customers will be seamlessly updated.\n\n It's important to note that this approach allows vendors to create new versions manually, despite the fact that in the common case, the versions are automatically created.\n This has a few benefits-- for example, it gives vendors the ability to change their descriptor URL if they need to\n (the descriptor URL will be immutable for existing versions)\n\n"
    },
    "vendor": {
      "$ref": "#/definitions/vendor",
      "fieldDescription": "\n\nThe vendor who is offering the add-on\n\n"
    },
    "translations": {
      "properties": {
        "paths": {
          "properties": {
            "ru-RU": {
              "format": "uri",
              "type": "string",
              "title": "ru-RU",
              "fieldDescription": "\n\nTranslations for the \"ru-RU\" (Russian) locale.\n\n"
            },
            "de-DE": {
              "format": "uri",
              "type": "string",
              "title": "de-DE",
              "fieldDescription": "\n\nTranslations for the \"de-DE\" (German) locale.\n\n"
            },
            "pt-PT": {
              "format": "uri",
              "type": "string",
              "title": "pt-PT",
              "fieldDescription": "\n\nTranslations for the \"pt-PT\" (Portuguese) locale.\n\n"
            },
            "en-US": {
              "format": "uri",
              "type": "string",
              "title": "en-US",
              "fieldDescription": "\n\nTranslations for the \"en-US\" (American English) locale.\n\n"
            },
            "ko-KR": {
              "format": "uri",
              "type": "string",
              "title": "ko-KR",
              "fieldDescription": "\n\nTranslations for the \"ko-KR\" (Korean) locale.\n\n"
            },
            "es-ES": {
              "format": "uri",
              "type": "string",
              "title": "es-ES",
              "fieldDescription": "\n\nTranslations for the \"es-ES\" (Spanish) locale.\n\n"
            },
            "en-UK": {
              "format": "uri",
              "type": "string",
              "title": "en-UK",
              "fieldDescription": "\n\nTranslations for the \"en-UK\" (British English) locale.\n\n"
            },
            "fr-FR": {
              "format": "uri",
              "type": "string",
              "title": "fr-FR",
              "fieldDescription": "\n\nTranslations for the \"fr-FR\" (French) locale.\n\n"
            },
            "ja-JP": {
              "format": "uri",
              "type": "string",
              "title": "ja-JP",
              "fieldDescription": "\n\nTranslations for the \"ja-JP\" (Japanese) locale.\n\n"
            }
          },
          "additionalProperties": false,
          "shortClassName": "translationPathsBean",
          "type": "object",
          "title": "Translation Paths",
          "description": "\n\nThis object is used to specify the locations of translations files.\n It is used in the <a href=\"../internationalization/\">translations</a> property of the add-on descriptor.\n\n Every property in this object is optional. The location defined in each property can be relative to the base URL of the add-on or absolute.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"en-US\": \"/i18n/1.0/en_US.json\",\n      \"en-UK\": \"/i18n/1.0/en_UK.json\",\n      \"fr-FR\": \"/i18n/1.0/fr_FR.json\",\n      \"de-DE\": \"/i18n/1.0/de_DE.json\",\n      \"pt-PT\": \"/i18n/1.0/pt_PT.json\",\n      \"es-ES\": \"/i18n/1.0/es_ES.json\",\n      \"ja-JP\": \"/i18n/1.0/ja_JP.json\",\n      \"ko-KR\": \"/i18n/1.0/ko_KR.json\",\n      \"ru-RU\": \"/i18n/1.0/ru_RU.json\"\n    }\n\n\n",
          "fieldDescription": "\n\nThe URLs of the translation files for your add-on.\n\n"
        }
      },
      "required": [
        "paths"
      ],
      "shortClassName": "translationsBean",
      "type": "object",
      "title": "Translations",
      "description": "\n\nDefines the locations of any translation files for your add-on.\n A translation file maps the localization keys for UI modules in your add-on descriptor to translated strings.\n You will need one translation file per language. To learn more, read <a href=\"../modules/i18n/\"> Internationalization</a>.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"paths\": {\n        \"en-US\": \"/i18n/1.0/en_US.json\",\n        \"en-UK\": \"/i18n/1.0/en_UK.json\",\n        \"fr-FR\": \"/i18n/1.0/fr_FR.json\",\n        \"de-DE\": \"/i18n/1.0/de_DE.json\",\n        \"pt-PT\": \"/i18n/1.0/pt_PT.json\",\n        \"es-ES\": \"/i18n/1.0/es_ES.json\",\n        \"ja-JP\": \"/i18n/1.0/ja_JP.json\",\n        \"ko-KR\": \"/i18n/1.0/ko_KR.json\",\n        \"ru-RU\": \"/i18n/1.0/ru_RU.json\"\n      }\n    }\n\n\n",
      "fieldDescription": "\n\n[Translations](../modules/i18n/) for this add-on.\n\n\n\n\n\n    {\n      \"translations\": {\n        \"paths\": {\n          \"en-US\": \"/i18n/1.0/en_US.json\",\n          \"en-UK\": \"/i18n/1.0/en_UK.json\",\n          \"fr-FR\": \"/i18n/1.0/fr_FR.json\",\n          \"de-DE\": \"/i18n/1.0/de_DE.json\",\n          \"pt-PT\": \"/i18n/1.0/pt_PT.json\",\n          \"es-ES\": \"/i18n/1.0/es_ES.json\",\n          \"ja-JP\": \"/i18n/1.0/ja_JP.json\",\n          \"ko-KR\": \"/i18n/1.0/ko_KR.json\",\n          \"ru-RU\": \"/i18n/1.0/ru_RU.json\"\n        }\n      }\n    }\n\n\n"
    },
    "installedDate": {
      "properties": {},
      "shortClassName": "date",
      "type": "object",
      "fieldDescription": "\n\n"
    },
    "enableLicensing": {
      "type": "boolean",
      "fieldDescription": "\n\nWhether or not to enable licensing options in the UPM/Marketplace for this add on\n\n",
      "defaultValue": "false"
    },
    "name": {
      "maxLength": 80,
      "type": "string",
      "fieldDescription": "\n\nThe human-readable name of the add-on\n\n"
    },
    "links": {
      "additionalProperties": true,
      "type": "object",
      "fieldDescription": "\n\nA set of links that the add-on wishes to publish\n\n\n\n\n\n    {\n      \"links\": {\n        \"self\": \"https://addon.domain.com/atlassian-connect.json\",\n        \"documentation\": \"https://addon.domain.com/docs\"\n      }\n    }\n\n\n"
    },
    "scopes": {
      "items": {
        "enum": [
          "none",
          "NONE",
          "read",
          "READ",
          "write",
          "WRITE",
          "delete",
          "DELETE",
          "project_admin",
          "PROJECT_ADMIN",
          "space_admin",
          "SPACE_ADMIN",
          "admin",
          "ADMIN",
          "act_as_user",
          "ACT_AS_USER",
          "access_email_addresses",
          "ACCESS_EMAIL_ADDRESSES"
        ],
        "type": "string"
      },
      "type": "array",
      "fieldDescription": "\n\nSet of [scopes](../../scopes/) requested by this add on\n\n\n\n\n\n    {\n      \"scopes\": [\n        \"write\",\n        \"read\"\n      ]\n    }\n\n\n"
    },
    "key": {
      "pattern": "^[a-zA-Z0-9-._]+$",
      "maxLength": 80,
      "type": "string",
      "fieldDescription": "\n\nA unique key to identify the add-on.\n This key must be &lt;= 80 characters, must only contain alphanumeric characters, dashes, underscores, and dots.\n\n"
    },
    "authentication": {
      "properties": {
        "publicKey": {
          "type": "string",
          "fieldDescription": "\n\nThe public key used for asymmetric key encryption. Ignored when using JWT with a shared secret.\n\n"
        },
        "type": {
          "enum": [
            "jwt",
            "JWT",
            "none",
            "NONE"
          ],
          "type": "string",
          "fieldDescription": "\n\nThe type of authentication to use.\n\n",
          "defaultValue": "jwt"
        }
      },
      "shortClassName": "authenticationBean",
      "type": "object",
      "title": "Authentication",
      "description": "\n\nDefines the authentication type to use when signing requests from the host application to the Connect add-on.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"authentication\": {\n        \"type\": \"jwt\"\n      }\n    }\n\n\n",
      "fieldDescription": "\n\nDefines the authentication type to use when signing requests between the host application and the connect add on.\n\n"
    }
  },
  "required": [
    "baseUrl",
    "key",
    "authentication"
  ],
  "shortClassName": "shallowConnectAddonBean",
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "title": "Add-On Descriptor",
  "description": "\n\n<p>The add-on descriptor is a JSON file (<code>atlassian-connect.json</code>) that describes the add-on to the Atlassian application.\n The descriptor includes general information for the add-on, as well as the modules that the add-on wants to use or\n extend.</p>\n\n <p>If you're familiar with Java add-on development with previous versions of the Atlassian Plugin Framework, you may already be\n familiar with the `atlassian-plugin.xml` descriptors. The `atlassian-connect.json` serves the same function.</p>\n\n <p>The descriptor serves as the glue between the remote add-on and the Atlassian application. When an administrator for a\n cloud instance installs an add-on, what they are really doing is installing this descriptor file, which\n contains pointers to your service. You can see an example below.</p>\n\n <p>For details and application-specific reference information on the descriptor please refer to the \"jira modules\"\n and \"confluence modules\" sections of this documentation. But we'll call out a few highlights from the example here.</p>\n\n <p>Since Atlassian Connect add-ons are remote and largely independent from the Atlassian application, they can be changed\n at any time, without having to create a new version or report the change to the Atlassian instance. The changes are\n reflected in the Atlassian instance immediately (or at least at page reload time).</p>\n\n <p>However, some add-on changes require a change to the descriptor file itself. For example, an add-on could be modified\n to have a new page module. Since this requires a page module declaration in the descriptor, it means making an updated\n descriptor available. Until that updated descriptor is re-installed into the Atlassian Product that change in the descriptor\n file will not take effect. To propagate a change in the descriptor to the Atlassian products, you need to create a new version\n of the add-on in its Marketplace listing. The Marketplace will take care of the rest: informing administrators\n and automatically installing the available update. See [Upgrades](/platform/marketplace/upgrading-and-versioning-cloud-apps/) for more details.</p>\n\n <div class=\"aui-message aui-message-info\">\n     <p class=\"title\">\n         <strong>Validating your descriptor</strong>\n     </p>\n     <p>You can validate your descriptor using this <a href=\"https://atlassian-connect-validator.herokuapp.com/validate\">handy tool</a>.</p>\n </div>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {},\n      \"key\": \"my-addon-key\",\n      \"dependencies\": {},\n      \"name\": \"My Connect Addon\",\n      \"description\": \"A connect addon that does something\",\n      \"vendor\": {\n        \"name\": \"My Company\",\n        \"url\": \"http://www.example.com\"\n      },\n      \"links\": {\n        \"self\": \"http://www.example.com/connect/jira\"\n      },\n      \"lifecycle\": {\n        \"installed\": \"/installed\",\n        \"uninstalled\": \"/uninstalled\"\n      },\n      \"baseUrl\": \"http://www.example.com/connect/jira\",\n      \"authentication\": {\n        \"type\": \"jwt\"\n      },\n      \"enableLicensing\": true,\n      \"scopes\": [\n        \"write\",\n        \"read\"\n      ],\n      \"translations\": {\n        \"paths\": {\n          \"en-US\": \"/i18n/1.0/en_US.json\",\n          \"en-UK\": \"/i18n/1.0/en_UK.json\",\n          \"fr-FR\": \"/i18n/1.0/fr_FR.json\",\n          \"de-DE\": \"/i18n/1.0/de_DE.json\",\n          \"pt-PT\": \"/i18n/1.0/pt_PT.json\",\n          \"es-ES\": \"/i18n/1.0/es_ES.json\",\n          \"ja-JP\": \"/i18n/1.0/ja_JP.json\",\n          \"ko-KR\": \"/i18n/1.0/ko_KR.json\",\n          \"ru-RU\": \"/i18n/1.0/ru_RU.json\"\n        }\n      },\n      \"apiMigrations\": {}\n    }\n\n\n",
  "definitions": {
    "webItem": {
      "properties": {
        "styleClasses": {
          "items": {
            "pattern": "^[_a-zA-Z]+[_a-zA-Z0-9-]*$",
            "type": "string"
          },
          "type": "array",
          "fieldDescription": "\n\nSpecifies custom styles for the web item target page, if desired. By default, the web item content gets\n styled in the default style of the target application.\n It must only contain alphanumeric characters, dashes, underscores\n and must only start with alpha characters or underscores.\n\n"
        },
        "context": {
          "enum": [
            "page",
            "PAGE",
            "addon",
            "ADDON",
            "product",
            "PRODUCT"
          ],
          "type": "string",
          "fieldDescription": "\n\nThe context for the URL parameter. Not applicable if an absolute URL is specified. Possible values\n <ul>\n     <li><pre>addon</pre> - a URL relative to the add-on's base URL</li>\n     <li><pre>page</pre> - targets a Page module by specifying the Page's module key as the URL</li>\n     <li><pre>product</pre> - a URL relative to the product's base URL</li>\n </ul>\n\n",
          "defaultValue": "addon"
        },
        "tooltip": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nThe internationalised text to be used in the link's tooltip.\n\n"
        },
        "icon": {
          "$ref": "#/definitions/icon",
          "fieldDescription": "\n\nAn optional icon to display with the link text or as the link, specified by URL to its hosted location.\n You can specify a particular width and height for the icon. Most link icons in Atlassian applications\n are 16 by 16 pixels.\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "weight": {
          "type": "integer",
          "fieldDescription": "\n\nDetermines the order in which the web item appears in the menu or list.\n\n The \"lightest\" weight (i.e., lowest number) appears first, rising relative to other items,\n while the \"heaviest\" weights sink to the bottom of the menu or list.\n\n Built-in web items have weights that are incremented by numbers that leave room for additional\n items, such as by 10 or 100. Be mindful of the weight you choose for your item, so that it appears\n in a sensible order given existing items.\n\n",
          "defaultValue": "100"
        },
        "location": {
          "type": "string",
          "fieldDescription": "\n\nThe location in the application interface where the web item should appear. For the Atlassian application\n interface, a location is something like the coordinates on a map. It points to a particular drop-down menu or\n navigation list in the UI.\n\n Places in the Atlassian UI are identified by what are known as \"well-known locations\".\n For example, the `system.admin/globalsettings` location is in the administrative\n menu on the left side of the Administration Console.\n\n Find product locations with the Web Fragment Finder\n\n <ul>\n     <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder/cloud/overview\">Jira Locations</a></li>\n     <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder-confluence/cloud/overview\">Confluence locations</a></li>\n </ul>\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "properties": {
                  "condition": {
                    "type": "string",
                    "fieldDescription": "\n\nA string indicating the name of the condition\n\n"
                  },
                  "invert": {
                    "type": "boolean",
                    "fieldDescription": "\n\nA flag indicating whether to invert the boolean result of the condition.\n\n",
                    "defaultValue": "false"
                  },
                  "params": {
                    "additionalProperties": true,
                    "type": "object",
                    "fieldTitle": "Object",
                    "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
                  }
                },
                "required": [
                  "condition"
                ],
                "shortClassName": "singleConditionBean",
                "type": "object",
                "title": "Single Condition",
                "description": "\n\nSingle Conditions are either provided by the host application. See the complete documentation of\n [Conditions](../../conditions/) for more information.\n\n To invert a condition, add the attribute ``invert=\"true\"`` to the condition element.\n This is useful where you want to show the section if a certain condition is not satisfied.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"condition\": \"user_is_logged_in\",\n      \"invert\": false\n    }\n\n\n"
              },
              {
                "properties": {
                  "conditions": {
                    "items": {
                      "type": "object",
                      "anyOf": [
                        {
                          "$ref": "#/definitions/singleCondition"
                        },
                        {
                          "$ref": "#"
                        }
                      ]
                    },
                    "type": "array",
                    "fieldDescription": "\n\nThe conditions to compose using the specific logical operator.\n\n"
                  },
                  "type": {
                    "enum": [
                      "and",
                      "AND",
                      "or",
                      "OR"
                    ],
                    "type": "string",
                    "fieldDescription": "\n\nDefines what logical operator is used to evaluate its collection of condition elements.\n\n"
                  }
                },
                "shortClassName": "compositeConditionBean",
                "type": "object",
                "title": "Composite Condition",
                "description": "\n\nComposite Conditions are composed of a collection of [Single Condition](../single-condition/) / Composite Conditions\n and a type attribute.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"conditions\": [\n        {\n          \"or\": [\n            {\n              \"condition\": \"can_attach_file_to_issue\",\n              \"invert\": false\n            },\n            {\n              \"condition\": \"is_issue_assigned_to_current_user\",\n              \"invert\": false\n            }\n          ]\n        },\n        {\n          \"condition\": \"user_is_logged_in\",\n          \"invert\": false\n        }\n      ]\n    }\n\n\n"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nSpecifies the destination of the web item. The interpretation of this field depends on the value of the\n <pre>context</pre> field.\n\n <p>\n     This field is required if the <code>target</code> of the item is not a\n     <a href=\"../dialog/\"><code>Dialog Module</code></a>.\n </p>\n\n Your add-on can receive [additional context](../../context-parameters/) from the application by\n using variable tokens in the URL attribute.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        },
        "target": {
          "properties": {
            "options": {
              "type": "object",
              "fieldDescription": "\n\n<p>An object containing options which vary based on the type of web item target you are implementing.</p>\n\n <p>Currently-allowed options are:</p>\n <ul>\n     <li><a href=\"../inline-dialog-options/\">Inline Dialog Options</a> when type is \"inlinedialog\", and</li>\n     <li><a href=\"../dialog-options/\">Dialog Options</a> when type is \"dialog\"</li>\n     <li><a href=\"../dialog-module-options/\">Dialog Module Options</a> when type is \"dialogmodule\"</li>\n </ul>\n\n",
              "anyOf": [
                {
                  "properties": {
                    "key": {
                      "type": "string",
                      "fieldDescription": "\n\n<p>The key of a <a href=\"../dialog/\">Dialog</a> module declared in this Connect add-on.</p>\n\n <p>\n The dialog module will include the <a href=\"../dialog-options/\">Dialog Options</a>\n that would otherwise need to be specified directly in this options object.\n </p>\n\n"
                    }
                  },
                  "required": [
                    "key"
                  ],
                  "shortClassName": "dialogModuleOptions",
                  "type": "object",
                  "title": "Dialog Module Options",
                  "description": "\n\nOptions for a web-item targeting a common <a href=\"../dialog/\">dialog module</a>.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"dialogmodule\",\n        \"options\": {\n          \"key\": \"dialog-module-key\"\n        }\n      }\n    }\n\n\n"
                },
                {
                  "properties": {
                    "offsetX": {
                      "type": "string",
                      "fieldDescription": "\n\nSets an offset distance of the inline-dialog from the trigger element along the x-axis in pixels\n\n"
                    },
                    "offsetY": {
                      "type": "string",
                      "fieldDescription": "\n\nSets an offset distance of the inline-dialog from the trigger element along the y-axis in pixels\n\n"
                    },
                    "width": {
                      "type": "string",
                      "fieldDescription": "\n\nSets how wide the dialog is in pixels.\n\n"
                    },
                    "onTop": {
                      "type": "boolean",
                      "fieldDescription": "\n\nDetermines if the dialog should be shown above the trigger or not. If this option is true but there is insufficient room above the trigger the inline-dialog will be flipped to display below it\n\n"
                    },
                    "showDelay": {
                      "type": "integer",
                      "fieldDescription": "\n\nDetermines how long in milliseconds after a show trigger is fired (such as a trigger click) until the dialog is shown\n\n"
                    },
                    "closeOthers": {
                      "type": "boolean",
                      "fieldDescription": "\n\nDetermines if all other dialogs on the screen are closed when this one is opened\n\n"
                    },
                    "persistent": {
                      "type": "boolean",
                      "fieldDescription": "\n\nThis option, ignores the 'closeOthers' option\n\n"
                    },
                    "onHover": {
                      "type": "boolean",
                      "fieldDescription": "\n\nDetermines whether the inline-Dialog will show on a mouseOver or mouseClick of the trigger\n\n"
                    },
                    "isRelativeToMouse": {
                      "type": "boolean",
                      "fieldDescription": "\n\nDetermines if the dialog should be shown relative to where the mouse is at the time of the event trigger (normally a click) if set to false the dialog will show aligned to the left of the trigger with the arrow showing at the center\n\n"
                    }
                  },
                  "shortClassName": "inlineDialogOptions",
                  "type": "object",
                  "title": "Inline Dialog Options",
                  "description": "\n\nOptions for an inline dialog target\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"inlinedialog\",\n        \"options\": {\n          \"onHover\": true,\n          \"offsetX\": \"30px\",\n          \"offsetY\": \"20px\"\n        }\n      }\n    }\n\n\n"
                },
                {
                  "properties": {
                    "size": {
                      "enum": [
                        "small",
                        "SMALL",
                        "medium",
                        "MEDIUM",
                        "large",
                        "LARGE",
                        "x-large",
                        "X-LARGE",
                        "fullscreen",
                        "FULLSCREEN",
                        "maximum",
                        "MAXIMUM"
                      ],
                      "type": "string",
                      "fieldDescription": "\n\nSets the size of the dialog.\n\n <p>\n     This option is used instead of the 'height' and 'width' options.\n </p>\n\n"
                    },
                    "chrome": {
                      "type": "boolean",
                      "fieldDescription": "\n\nWhether the dialog should contain the AUI header and buttons.\n\n",
                      "defaultValue": "true"
                    },
                    "width": {
                      "type": "string",
                      "fieldDescription": "\n\nSets how wide the dialog is in pixels.\n\n"
                    },
                    "header": {
                      "$ref": "#/definitions/i18nProperty",
                      "fieldDescription": "\n\nThe header text for the dialog, if chrome is enabled.\n\n"
                    },
                    "height": {
                      "type": "string",
                      "fieldDescription": "\n\nSets how high the dialog is in pixels\n\n"
                    }
                  },
                  "shortClassName": "dialogOptions",
                  "type": "object",
                  "title": "Dialog Options",
                  "description": "\n\nOptions for a modal dialog <a href=\"../web-item-target/\">web item target</a> or <a href=\"../dialog/\">common module</a>.\n\n <p>\n     These options are a subset of those available via the <a href=\"../../jsapi/dialog/\">JavaScript API</a>.\n </p>\n\n <h2>Web Item Example</h2>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"dialog\",\n        \"options\": {\n          \"height\": \"100px\",\n          \"width\": \"200px\"\n        }\n      }\n    }\n\n\n\n\n <h2>Dialog Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"dialogs\": [\n          {\n            \"url\": \"/my-dialog-content\",\n            \"options\": {\n              \"size\": \"fullscreen\",\n              \"header\": {\n                \"value\": \"Example Dialog\"\n              }\n            },\n            \"key\": \"dialog-module-key\"\n          }\n        ]\n      }\n    }\n\n\n"
                }
              ]
            },
            "type": {
              "enum": [
                "page",
                "PAGE",
                "dialog",
                "DIALOG",
                "inlinedialog",
                "INLINEDIALOG",
                "dialogmodule",
                "DIALOGMODULE"
              ],
              "type": "string",
              "fieldDescription": "\n\nDefines how the web-item content should be loaded by the page. By default, the web-item is loaded in the same\n page. The target can be set to open the web-item url as a modal dialog or an inline dialog.\n\n",
              "defaultValue": "page"
            }
          },
          "shortClassName": "webItemTargetBean",
          "type": "object",
          "title": "Web Item Target",
          "description": "\n\nDefines the way a <a href=\"../web-item/\">web item</a> link is opened in the browser, such as in a modal or inline dialog.\n\n <h2>Inline Dialog Example</h2>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"inlinedialog\",\n        \"options\": {\n          \"onHover\": true,\n          \"offsetX\": \"30px\",\n          \"offsetY\": \"20px\"\n        }\n      }\n    }\n\n\n\n\n <h2>Dialog Example</h2>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"dialog\",\n        \"options\": {\n          \"height\": \"100px\",\n          \"width\": \"200px\"\n        }\n      }\n    }\n\n\n\n\n <h2>Common Dialog Module Example</h2>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"dialogmodule\",\n        \"options\": {\n          \"key\": \"dialog-module-key\"\n        }\n      }\n    }\n\n\n\n\n <p>More details for this use-case can be found on the <a href=\"../dialog/\">Dialog Module</a> page.</p>\n\n",
          "fieldDescription": "\n\nDefines the behaviour when the item is triggered.\n If omitted, the url behaves as a regular hyperlink.\n\n"
        }
      },
      "required": [
        "name",
        "location",
        "key"
      ],
      "shortClassName": "webItemModuleBean",
      "type": "object",
      "title": "Web Item",
      "description": "\n\n<p>Adds a web item to a specified location in the application interface. A web item is a hyperlink\n that’s inserted into some standard place in the Atlassian application interface, such as the\n administration menu.</p>\n\n <p>The form that the link takes can vary depending on the location. For instance, a web item in the header bar\n (with a location section of `system.top.navigation.bar`) adds a link to the navigation bar across the top of the\n interface. On the other hand, a web item in the `opsbar-operation` location section in Jira adds an item to the\n issue operation buttons.</p>\n\n <p>A web item link can open a new page in the application or a dialog, depending on your configuration.</p>\n\n <p>Web items are a simple and useful way to extend Atlassian applications. If you want to extend an Atlassian\n application and don't know where to start, a web item may be all you need.</p>\n\n <p>Your add-on can receive [additional context](../../context-parameters/) from the application by\n using variable tokens in the `url` attribute.</p>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"webItems\": [\n          {\n            \"location\": \"system.preset.filters\",\n            \"weight\": 200,\n            \"styleClasses\": [\n              \"webitem\",\n              \"system-present-webitem\"\n            ],\n            \"url\": \"/my-web-item\",\n            \"context\": \"addon\",\n            \"target\": {\n              \"type\": \"page\"\n            },\n            \"tooltip\": {\n              \"value\": \"Example tooltip\"\n            },\n            \"icon\": {\n              \"width\": 16,\n              \"height\": 16,\n              \"url\": \"/maps/icon.png\"\n            },\n            \"name\": {\n              \"value\": \"My Web Item\"\n            },\n            \"key\": \"web-item-example\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "webPanel": {
      "properties": {
        "layout": {
          "$ref": "#/definitions/webPanelLayout",
          "fieldDescription": "\n\nThe width and height of the web panel on the page.\n\n"
        },
        "tooltip": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nInformation about the web panel that will be shown when hovering over its header\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "weight": {
          "type": "integer",
          "fieldDescription": "\n\nDetermines the order in which web panels appear. Web panels are displayed top to bottom or left to right in order\n of ascending weight. The \"lightest\" weight is displayed first, while the \"heaviest\" weights sink to the bottom.\n The weight values for most panels start from 100, and the weights for the links generally start from 10. The\n weight is incremented by 10 for each in sequence to leave room for custom panels.\n\n"
        },
        "location": {
          "type": "string",
          "fieldDescription": "\n\n<p>Location in the application interface for this panel.</p>\n\n Find product locations with the Web Fragment Finder\n\n <ul>\n     <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder/cloud/overview\">Jira Locations</a></li>\n     <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder-confluence/cloud/overview\">Confluence locations</a></li>\n </ul>\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/singleCondition"
              },
              {
                "$ref": "#/definitions/compositeCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nThe URL of the add-on resource that provides the web panel content. This URL must be relative to the add-on's \n baseUrl and can use <a href=\"../../context-parameters/\">context parameters</a>.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "name",
        "location",
        "url",
        "key"
      ],
      "shortClassName": "webPanelModuleBean",
      "type": "object",
      "title": "Web Panel",
      "description": "\n\nAdds a panel (or section) to a page in the Atlassian application. Panels let you present related information and\n controls in the application interface as a group. For example, the existing \"People\" panel in Jira issue view shows\n the assignee, reporter, and similar information for the issue.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"webPanels\": [\n          {\n            \"url\": \"/web-panel\",\n            \"location\": \"atl.jira.view.issue.right.context\",\n            \"layout\": {\n              \"width\": \"10px\",\n              \"height\": \"100%\"\n            },\n            \"weight\": 50,\n            \"name\": {\n              \"value\": \"My Web Panel\"\n            },\n            \"key\": \"my-web-panel\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "webhook": {
      "properties": {
        "filter": {
          "type": "string",
          "fieldDescription": "\n\nFilter for entities that the webhook will be triggered for. Refer to the documentation on <a href=\"#Filtering\">filtering</a> for details.\n\n"
        },
        "excludeBody": {
          "type": "boolean",
          "fieldDescription": "\n\nSpecifies if webhook will send JSON body when triggered. By default, a webhook will send a request with a JSON body.\n\n",
          "defaultValue": "false"
        },
        "event": {
          "type": "string",
          "fieldDescription": "\n\nSpecifies the named event you would like to listen to (e.g., \"enabled\", \"jira:issue\\_created\", etc.)\n\n"
        },
        "propertyKeys": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "fieldDescription": "\n\nSpecifies entity properties which will be returned inside JSON body. If not specified no properties will be returned.\n\n Currently this is supported only in Jira webhooks, for all events that support <a href=\"../../jira-entity-properties/\">Entity Properties</a>.\n Note that properties won't be returned for entity-deleted events, since the properties are already deleted by the time the webhook is sent.\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nSpecifies your add-on's POST webhook handler URL. This property must be a URL relative to the add-on's baseUrl.\n\n"
        }
      },
      "required": [
        "event",
        "url"
      ],
      "shortClassName": "webHookModuleBean",
      "type": "object",
      "title": "Webhook",
      "description": "\n\nA webhook is a standard mechanism for an add-on to listen to in-product events via HTTP callbacks. An add-on can register\n a webhook in the Atlassian Connect descriptor to listen to events that are fired by Jira or Confluence.\n\n Just to give you an idea of how you can use them in add-ons, here are a few sample webhook events:\n\n <ul>\n  <li>When an issue is created or closed in Jira</li>\n  <li>When a page is created or updated in Confluence</li>\n  <li>An attachment is viewed in Confluence</li>\n </ul>\n\n If your add-on uses webhooks, you must declare the <a href=\"../../scopes/\">\"read\" scope</a>\n in your <a href=\"../../add-on-descriptor/\"><code>atlassian-connect.json</code> descriptor</a>.\n\n <h3>Handling the webhook event</h3>\n\n To receive webhook events, your add-on needs to include the webhook module declaration in its JSON descriptor. The\n declaration indicates the add-on relative URL at which it will receive the notification. In other\n words, the Atlassian application will send an HTTP POST to this resource in response to an application event. The\n add-on code that handles the POST should process any information passed in the body of the message, as appropriate.\n Each webhook POST sent to the add-on will also include the authentication headers that allow the add-on to validate\n the authenticity of that request. Specifically, the JWT token can be found in the \"Authorization\" HTTP header.\n\n Note that if using Apache and mod\\_wsgi to serve files to a Django application, the Authentication header is stripped\n out by default. <a href=\"http://www.django-rest-framework.org/api-guide/authentication/#apache-mod_wsgi-specific-configuration\">Extra configuration</a>\n is required to ensure the Authentication header is visible.\n\n <strong>Important:</strong> It must be noted that webhook delivery is not guaranteed; it is best effort. When a webhook\n event is triggered in Jira or Confluence instance then a single HTTP POST is sent to your add-on. If your add-on is down,\n or there is any network problems between the Atlassian product and your add-on, then you will never receive the\n webhook event. In general, webhooks are quite reliable; however you must always keep in mind that delivery is not guaranteed.\n\n <h3>Variable Substitution</h3>\n\n Jira webhooks also provide a way to add and substitute variables in the url. This is similar to context parameters for add-ons. See\n <a href=\"../../context-parameters/\">context parameters</a>.\n\n For example, if we register to listen for one of the project events with a url containing <code>${project.id}</code>, a POST message will\n be sent to the address with the <code>${project.id}</code> replaced by the id of the project that the event was triggered for.\n\n <h3 id=\"Filtering\">Filtering</h3>\n Additional filters may be specified to trigger webhooks only for events satisfying certain conditions.\n How the filter value is supposed to look like exactly, and whether filtering is available at all, depends on the event type.\n The following sections describe all the possibilities.\n\n <h4>JQL</h4>\n\n Issue-related events may be filtered with JQL. Webhooks will be sent only for issues matched by the provided JQL query.\n Here is an example JQL query that can be put into the \"filter\" property: \"project = TEST AND fixVersion = future\".\n\n JQL filtering is supported only by the following event types:\n\n <ul>\n  <li><code>jira:issue\\_created</code></li>\n  <li><code>jira:issue\\_deleted</code></li>\n  <li><code>jira:issue\\_updated</code></li>\n  <li><code>comment\\_created</code></li>\n  <li><code>comment\\_updated</code></li>\n  <li><code>comment\\_deleted</code></li>\n </ul>\n\n <h3>Webhook event types</h3>\n\n Below is a list of all available webhook events.\n\n <h4>Add-on and system events</h4>\n <ul>\n  <li><code>connect\\_addon\\_disabled</code></li>\n  <li><code>connect\\_addon\\_enabled</code></li>\n </ul>\n\n <h4>Issue events</h4>\n <ul>\n  <li><code>jira:issue\\_created</code></li>\n  <li><code>jira:issue\\_deleted</code></li>\n  <li><code>jira:issue\\_updated</code>\n\n Context parameters are <code>${project.id}, ${project.key}, ${issue.key}, ${issue.id}</code>.</li>\n </ul>\n\n <h4>Version events</h4>\n <ul>\n  <li><code>jira:version\\_created</code></li>\n  <li><code>jira:version\\_deleted</code></li>\n  <li><code>jira:version\\_merged</code></li>\n  <li><code>jira:version\\_updated</code></li>\n  <li><code>jira:version\\_moved</code></li>\n  <li><code>jira:version\\_released</code></li>\n  <li><code>jira:version\\_unreleased</code>\n\n Context parameters are <code>${project.id}, ${project.key}, ${version.id}</code>.\n\n Special context parameter for version\\_merged event is <code>${mergedVersion.id}</code>.</li>\n </ul>\n\n <h4>Project events</h4>\n <ul>\n  <li><code>project\\_created</code></li>\n  <li><code>project\\_updated</code></li>\n  <li><code>project\\_deleted</code>\n\n Context parameters are <code>${project.id}, ${project.key}</code></li>\n </ul>\n\n <h4>User events</h4>\n <ul>\n  <li><code>user\\_created</code></li>\n  <li><code>user\\_deleted</code></li>\n  <li><code>user\\_updated</code>\n\n Context parameters: <code>${modifiedUser.accountId}</code>, <code>${modifiedUser.name}</code> (deprecated), <code>${modifiedUser.key}</code> (deprecated)</li>\n </ul>\n\n <h4>Feature status events</h4>\n <ul>\n  <li><code>option\\_voting\\_changed</code></li>\n  <li><code>option\\_watching\\_changed</code></li>\n  <li><code>option\\_unassigned\\_issues\\_changed</code></li>\n  <li><code>option\\_subtasks\\_changed</code></li>\n  <li><code>option\\_attachments\\_changed</code></li>\n  <li><code>option\\_issuelinks\\_changed</code></li>\n  <li><code>option\\_timetracking\\_changed</code></li>\n </ul>\n\n <h4>Comment events</h4>\n <ul>\n  <li><code>comment\\_created</code></li>\n  <li><code>comment\\_updated</code></li>\n  <li><code>comment\\_deleted</code></li>\n </ul>\n\n <h4>Confluence Webhook events</h4>\n\n <ul>\n  <li><code>attachment\\_created</code></li>\n  <li><code>attachment\\_removed</code></li>\n  <li><code>attachment\\_restored</code></li>\n  <li><code>attachment\\_trashed</code></li>\n  <li><code>attachment\\_updated</code></li>\n  <li><code>attachment\\_viewed</code></li>\n  <li><code>blog\\_created</code></li>\n  <li><code>blog\\_removed</code></li>\n  <li><code>blog\\_restored</code></li>\n  <li><code>blog\\_trashed</code></li>\n  <li><code>blog\\_updated</code></li>\n  <li><code>blog\\_viewed</code></li>\n  <li><code>blueprint\\_page\\_created</code></li>\n  <li><code>comment\\_created</code></li>\n  <li><code>comment\\_removed</code></li>\n  <li><code>comment\\_updated</code></li>\n  <li><code>connect\\_addon\\_disabled</code></li>\n  <li><code>connect\\_addon\\_enabled</code></li>\n  <li><code>content\\_created</code></li>\n  <li><code>content\\_restored</code></li>\n  <li><code>content\\_trashed</code></li>\n  <li><code>content\\_updated</code></li>\n  <li><code>content\\_permissions\\_updated</code></li>\n  <li><code>group\\_created</code></li>\n  <li><code>group\\_removed</code></li>\n  <li><code>label\\_added</code></li>\n  <li><code>label\\_created</code></li>\n  <li><code>label\\_deleted</code></li>\n  <li><code>label\\_removed</code></li>\n  <li><code>login</code></li>\n  <li><code>login\\_failed</code></li>\n  <li><code>logout</code></li>\n  <li><code>page\\_children\\_reordered</code></li>\n  <li><code>page\\_created</code></li>\n  <li><code>page\\_moved</code></li>\n  <li><code>page\\_removed</code></li>\n  <li><code>page\\_restored</code></li>\n  <li><code>page\\_trashed</code></li>\n  <li><code>page\\_updated</code></li>\n  <li><code>page\\_viewed</code></li>\n  <li><code>relation\\_created</code></li>\n  <li><code>relation\\_deleted</code></li>\n  <li><code>search\\_performed</code></li>\n  <li><code>space\\_created</code></li>\n  <li><code>space\\_logo\\_updated</code></li>\n  <li><code>space\\_permissions\\_updated</code></li>\n  <li><code>space\\_removed</code></li>\n  <li><code>space\\_updated</code></li>\n  <li><code>theme\\_enabled</code></li>\n  <li><code>user\\_created</code></li>\n  <li><code>user\\_deactivated</code></li>\n  <li><code>user\\_followed</code></li>\n  <li><code>user\\_reactivated</code></li>\n  <li><code>user\\_removed</code></li>\n </ul>\n\n <h4>Example request</h4>\n\n <pre><code>\n POST /jira-issue\\_created?user\\_id=admin&amp;user\\_key=admin HTTP/1.1\n Authorization: JWT ...\n Atlassian-Connect-Version: x.x\n Content-Type: application/json\n {\n   timestamp: 1426661049725,\n   webhookEvent: 'jira:issue\\_created',\n   ...\n }\n </code></pre>\n\n <h3>Example responses</h3>\n\n All webhooks will post JSON data to the listening add-on. The structure of this JSON differs based on the Atlassian\n product that sent the event and the event itself. Here are some example webhook events:\n\n <h4>Jira issue-related webhook event structure</h4>\n\n All webhook events that are sent because of Jira issue updates will have the following structure.\n\n <pre><code>\n {\n   \"timestamp\"\n   \"event\"\n   \"user\": {\n     // See User shape in the linked document\n   },\n   \"issue\": {\n     // See Issue shape in the linked document\n   },\n   \"changelog\" : {\n     // See Changelog shape in the linked document\n   },\n   \"comment\" : {\n     // See Comment shape in in the linked document\n   }\n }\n </code></pre>\n\n This is fully documented in <a href=\"https://developer.atlassian.com/cloud/jira/platform/webhooks/#example-callback-for-an-issue-related-event\">Webhooks: Example callback for an issue-related event</a>.\n\n <h4>Confluence page\\_created</h4>\n\n <pre><code>\n {\n   \"page\": {\n     \"spaceKey\": \"~admin\",\n     \"modificationDate\": 1471926079631,\n     \"creatorKey\": \"ff80808154510724015451074c160001\",\n     \"creatorName\": \"admin\",\n     \"lastModifierKey\": \"ff80808154510724015451074c160001\",\n     \"self\": \"https://cloud-development-environment.atlassian.net/wiki/display/~admin/Some+random+test+page\",\n     \"lastModifierName\": \"admin\",\n     \"id\": 16777227,\n     \"title\": \"Some random test page\",\n     \"creationDate\": 1471926079631,\n     \"version\": 1\n   },\n   \"user\": \"admin\",\n   \"userKey\": \"ff80808154510724015451074c160001\",\n   \"timestamp\": 1471926079645,\n   \"username\": \"admin\"\n }\n </code></pre>\n\n <h4>Confluence comment\\_created</h4>\n\n <pre><code>\n {\n   \"comment\": {\n     \"spaceKey\": \"~admin\",\n     \"parent\": {\n       \"spaceKey\": \"~admin\",\n       \"modificationDate\": 1471926079631,\n       \"creatorKey\": \"ff80808154510724015451074c160001\",\n       \"creatorName\": \"admin\",\n       \"lastModifierKey\": \"ff80808154510724015451074c160001\",\n       \"self\": \"https://cloud-development-environment.atlassian.net/wiki/display/~admin/Some+random+test+page\",\n       \"lastModifierName\": \"admin\",\n       \"id\": 16777227,\n       \"title\": \"Some random test page\",\n       \"creationDate\": 1471926079631,\n       \"version\": 1\n     },\n     \"modificationDate\": 1471926091465,\n     \"creatorKey\": \"ff80808154510724015451074c160001\",\n     \"creatorName\": \"admin\",\n     \"lastModifierKey\": \"ff80808154510724015451074c160001\",\n     \"self\": \"https://cloud-development-environment/wiki/display/~admin/Some+random+test+page?focusedCommentId=16777228#comment-16777228\",\n     \"lastModifierName\": \"admin\",\n     \"id\": 16777228,\n     \"creationDate\": 1471926091465,\n     \"version\": 1\n   },\n   \"user\": \"admin\",\n   \"userKey\": \"ff80808154510724015451074c160001\",\n   \"timestamp\": 1471926091468,\n   \"username\": \"admin\"\n }\n </code></pre>\n\n <h3>Inspecting webhook contents</h3>\n\n Each type of webhook event includes information specific to that event in the body content of the POST message. The\n add-on resource that listens for webhook posts should receive and process the content as appropriate for the add-on.\n To understand what type of content each webhook generates, you can use the Connect inspector tool.\n\n The <a href=\"http://go.atlassian.com/connect-inspector\">Connect inspector</a> is a service that generates temporary\n Atlassian Connect add-on's that you can install in your development environment to inspect the content of event messages.\n The Connect inspector subscribes to every webhook event type available on the running instance of the Atlassian application,\n and prints the body posted by the instance to your web browser.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"webhooks\": [\n          {\n            \"event\": \"jira:issue_created\",\n            \"url\": \"/issue-created\",\n            \"excludeBody\": false,\n            \"filter\": \"project = HSA\",\n            \"propertyKeys\": [\n              \"propertyKey\",\n              \"otherPropertyKey\"\n            ]\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "dialogOptions": {
      "properties": {
        "size": {
          "enum": [
            "small",
            "SMALL",
            "medium",
            "MEDIUM",
            "large",
            "LARGE",
            "x-large",
            "X-LARGE",
            "fullscreen",
            "FULLSCREEN",
            "maximum",
            "MAXIMUM"
          ],
          "type": "string",
          "fieldDescription": "\n\nSets the size of the dialog.\n\n <p>\n     This option is used instead of the 'height' and 'width' options.\n </p>\n\n"
        },
        "chrome": {
          "type": "boolean",
          "fieldDescription": "\n\nWhether the dialog should contain the AUI header and buttons.\n\n",
          "defaultValue": "true"
        },
        "width": {
          "type": "string",
          "fieldDescription": "\n\nSets how wide the dialog is in pixels.\n\n"
        },
        "header": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nThe header text for the dialog, if chrome is enabled.\n\n"
        },
        "height": {
          "type": "string",
          "fieldDescription": "\n\nSets how high the dialog is in pixels\n\n"
        }
      },
      "shortClassName": "dialogOptions",
      "type": "object",
      "title": "Dialog Options",
      "description": "\n\nOptions for a modal dialog <a href=\"../web-item-target/\">web item target</a> or <a href=\"../dialog/\">common module</a>.\n\n <p>\n     These options are a subset of those available via the <a href=\"../../jsapi/dialog/\">JavaScript API</a>.\n </p>\n\n <h2>Web Item Example</h2>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"dialog\",\n        \"options\": {\n          \"height\": \"100px\",\n          \"width\": \"200px\"\n        }\n      }\n    }\n\n\n\n\n <h2>Dialog Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"dialogs\": [\n          {\n            \"url\": \"/my-dialog-content\",\n            \"options\": {\n              \"size\": \"fullscreen\",\n              \"header\": {\n                \"value\": \"Example Dialog\"\n              }\n            },\n            \"key\": \"dialog-module-key\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "icon": {
      "properties": {
        "width": {
          "type": "integer",
          "fieldDescription": "\n\nThe width in pixels of the icon image.\n\n"
        },
        "url": {
          "format": "uri",
          "type": "string",
          "fieldDescription": "\n\nThe URL of the icon. Your icon needs to be hosted remotely at a web-accessible location. You can specify the\n URL as an absolute URL or relative to the add-on's base URL.\n\n"
        },
        "height": {
          "type": "integer",
          "fieldDescription": "\n\nThe height in pixels of the icon image.\n\n"
        }
      },
      "required": [
        "url"
      ],
      "shortClassName": "iconBean",
      "type": "object",
      "title": "Icon",
      "description": "\n\nDefines an icon to display.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"icon\": {\n        \"width\": 16,\n        \"height\": 16,\n        \"url\": \"/my-icon.png\"\n      }\n    }\n\n\n"
    },
    "singleCondition": {
      "properties": {
        "condition": {
          "type": "string",
          "fieldDescription": "\n\nA string indicating the name of the condition\n\n"
        },
        "invert": {
          "type": "boolean",
          "fieldDescription": "\n\nA flag indicating whether to invert the boolean result of the condition.\n\n",
          "defaultValue": "false"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        }
      },
      "required": [
        "condition"
      ],
      "shortClassName": "singleConditionBean",
      "type": "object",
      "title": "Single Condition",
      "description": "\n\nSingle Conditions are either provided by the host application. See the complete documentation of\n [Conditions](../../conditions/) for more information.\n\n To invert a condition, add the attribute ``invert=\"true\"`` to the condition element.\n This is useful where you want to show the section if a certain condition is not satisfied.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"condition\": \"user_is_logged_in\",\n      \"invert\": false\n    }\n\n\n"
    },
    "webPanelLayout": {
      "properties": {
        "width": {
          "type": "string",
          "fieldDescription": "\n\n"
        },
        "height": {
          "type": "string",
          "fieldDescription": "\n\n"
        }
      },
      "shortClassName": "webPanelLayout",
      "type": "object",
      "title": "Web Panel Layout",
      "description": "\n\n<h3>Example</h3>\n\n\n\n\n\n    {\n      \"layout\": {\n        \"width\": \"100\",\n        \"height\": \"200\"\n      }\n    }\n\n\n"
    },
    "webSection": {
      "properties": {
        "tooltip": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nThe internationalised text to be used in the link's tooltip.\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "weight": {
          "type": "integer",
          "fieldDescription": "\n\n<p>Determines the order in which the web section appears in the menu or list.</p>\n\n <p>The \"lightest\" weight (i.e., lowest number) appears first, rising relative to other items, while the \"heaviest\"\n weights sink to the bottom of the menu or list.</p>\n\n <p>Built-in web sections have weights that are incremented by numbers that leave room for additional sections, such\n as by 10 or 100. Be mindful of the weight you choose for your item, so that it appears in a sensible order given\n existing items.</p>\n\n",
          "defaultValue": "100"
        },
        "location": {
          "type": "string",
          "fieldDescription": "\n\nThe location in the application interface where the web section should appear. For the Atlassian application\n interface, a location is something like the coordinates on a map. It points to a particular drop-down menu or\n navigation list in the UI.\n\n Find product locations with the Web Fragment Finder\n\n <ul>\n     <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder/cloud/overview\">Jira Locations</a></li>\n     <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder-confluence/cloud/overview\">Confluence locations</a></li>\n </ul>\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/compositeCondition"
              },
              {
                "$ref": "#/definitions/singleCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "name",
        "location",
        "key"
      ],
      "shortClassName": "webSectionModuleBean",
      "type": "object",
      "title": "Web Section",
      "description": "\n\nThe Web Section plugin module allows add-ons to define new sections in application menus. Each section can contain one or\n more links. To insert the links themselves, see the [Web Item Module](../web-item/).\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"webSections\": [\n          {\n            \"location\": \"atl.jira.view.issue.right.context\",\n            \"weight\": 50,\n            \"name\": {\n              \"value\": \"My Web Section\"\n            },\n            \"key\": \"my-web-section\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "i18nProperty": {
      "properties": {
        "value": {
          "type": "string",
          "fieldDescription": "\n\nThe human-readable default value. This will be used if no translation exists.\n\n"
        },
        "i18n": {
          "type": "string",
          "fieldDescription": "\n\nThe localization key for the human-readable value.\n <a href=\"../../internationalization/\">Translations</a> for the keys are defined at the top level of the\n <a href=\"../../add-on-descriptor/\">add-on descriptor</a>.\n\n"
        }
      },
      "required": [
        "value"
      ],
      "shortClassName": "i18nProperty",
      "type": "object",
      "title": "i18n Property",
      "description": "\n\nRepresents a string that can be resolved via a localization properties file. You can use the same `i18n Property` key\n and value in multiple places if you like, but identical keys must have identical values.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"name\": {\n        \"value\": \"My Label\"\n      }\n    }\n\n\n"
    },
    "compositeCondition": {
      "properties": {
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#"
              },
              {
                "$ref": "#/definitions/singleCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\nThe conditions to compose using the specific logical operator.\n\n"
        },
        "type": {
          "enum": [
            "and",
            "AND",
            "or",
            "OR"
          ],
          "type": "string",
          "fieldDescription": "\n\nDefines what logical operator is used to evaluate its collection of condition elements.\n\n"
        }
      },
      "shortClassName": "compositeConditionBean",
      "type": "object",
      "title": "Composite Condition",
      "description": "\n\nComposite Conditions are composed of a collection of [Single Condition](../single-condition/) / Composite Conditions\n and a type attribute.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"conditions\": [\n        {\n          \"or\": [\n            {\n              \"condition\": \"can_attach_file_to_issue\",\n              \"invert\": false\n            },\n            {\n              \"condition\": \"is_issue_assigned_to_current_user\",\n              \"invert\": false\n            }\n          ]\n        },\n        {\n          \"condition\": \"user_is_logged_in\",\n          \"invert\": false\n        }\n      ]\n    }\n\n\n"
    },
    "dialog": {
      "properties": {
        "options": {
          "$ref": "#/definitions/dialogOptions",
          "fieldDescription": "\n\n<p>An object containing options for this dialog.</p>\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nSpecifies the URL of the content displayed in the dialog. The URL can be absolute or relative to either the\n product URL or the add-on's base URL, depending on the _context_ attribute.\n\n Your add-on can receive <a href=\"../../context-parameters/\">additional context</a> from the application by\n using variable tokens in the URL attribute.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "url",
        "key"
      ],
      "shortClassName": "dialogModuleBean",
      "type": "object",
      "title": "Dialog",
      "description": "\n\n<p>A common dialog definition that may be referenced by other Connect modules and from JavaScript API calls.</p>\n\n <p>\n For example, take the following dialog module:\n </p>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"dialogs\": [\n          {\n            \"url\": \"/my-dialog-content\",\n            \"options\": {\n              \"size\": \"fullscreen\",\n              \"header\": {\n                \"value\": \"Example Dialog\"\n              }\n            },\n            \"key\": \"dialog-module-key\"\n          }\n        ]\n      }\n    }\n\n\n\n\n <p>\n This common dialog might be referenced from a <a href=\"../web-item-target/\">web item target</a>, so that\n triggering the web item launches the dialog:\n </p>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"dialogmodule\",\n        \"options\": {\n          \"key\": \"dialog-module-key\"\n        }\n      }\n    }\n\n\n\n\n <p>\n The common dialog might also be referenced when creating a Dialog manually with the\n <a href=\"../../jsapi/dialog/\">JavaScript API</a>:\n </p>\n <pre><code>\n AP.require('dialog', function(dialog){\n   dialog.create({\n     key: 'dialog-module-key'\n   }).on(\"close\", callbackFunc);\n });\n </code></pre>\n\n"
    },
    "inlineDialogOptions": {
      "properties": {
        "offsetX": {
          "type": "string",
          "fieldDescription": "\n\nSets an offset distance of the inline-dialog from the trigger element along the x-axis in pixels\n\n"
        },
        "offsetY": {
          "type": "string",
          "fieldDescription": "\n\nSets an offset distance of the inline-dialog from the trigger element along the y-axis in pixels\n\n"
        },
        "width": {
          "type": "string",
          "fieldDescription": "\n\nSets how wide the dialog is in pixels.\n\n"
        },
        "onTop": {
          "type": "boolean",
          "fieldDescription": "\n\nDetermines if the dialog should be shown above the trigger or not. If this option is true but there is insufficient room above the trigger the inline-dialog will be flipped to display below it\n\n"
        },
        "showDelay": {
          "type": "integer",
          "fieldDescription": "\n\nDetermines how long in milliseconds after a show trigger is fired (such as a trigger click) until the dialog is shown\n\n"
        },
        "closeOthers": {
          "type": "boolean",
          "fieldDescription": "\n\nDetermines if all other dialogs on the screen are closed when this one is opened\n\n"
        },
        "persistent": {
          "type": "boolean",
          "fieldDescription": "\n\nThis option, ignores the 'closeOthers' option\n\n"
        },
        "onHover": {
          "type": "boolean",
          "fieldDescription": "\n\nDetermines whether the inline-Dialog will show on a mouseOver or mouseClick of the trigger\n\n"
        },
        "isRelativeToMouse": {
          "type": "boolean",
          "fieldDescription": "\n\nDetermines if the dialog should be shown relative to where the mouse is at the time of the event trigger (normally a click) if set to false the dialog will show aligned to the left of the trigger with the arrow showing at the center\n\n"
        }
      },
      "shortClassName": "inlineDialogOptions",
      "type": "object",
      "title": "Inline Dialog Options",
      "description": "\n\nOptions for an inline dialog target\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"inlinedialog\",\n        \"options\": {\n          \"onHover\": true,\n          \"offsetX\": \"30px\",\n          \"offsetY\": \"20px\"\n        }\n      }\n    }\n\n\n"
    },
    "pageModule": {
      "properties": {
        "icon": {
          "$ref": "#/definitions/icon",
          "fieldDescription": "\n\nAn optional icon to display with the link text or as the link, specified by URL to its hosted location.\n  You can specify a particular width and height for the icon. Most link icons in Atlassian applications\n  are 16 by 16 pixels.\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "weight": {
          "type": "integer",
          "fieldDescription": "\n\nDetermines the order in which the page's link appears in the menu or list.\n\n The \"lightest\" weight (i.e., lowest number) appears first, rising relative to other items,\n while the \"heaviest\" weights sink to the bottom of the menu or list.\n\n Built-in web items have weights that are incremented by numbers that leave room for additional\n items, such as by 10 or 100. Be mindful of the weight you choose for your item, so that it appears\n in a sensible order given existing items.\n\n",
          "defaultValue": "100"
        },
        "cacheable": {
          "type": "boolean",
          "fieldDescription": "\n\nReturns whether the URL should be cacheable. Cacheable URLs are taken directly from the add-on descriptor, and\n lack all additional query parameters:\n <ul>\n     <li>standard iframe query parameters</li>\n     <li>product context parameters</li>\n     <li>JWT token</li>\n </ul>\n\n",
          "defaultValue": "false"
        },
        "location": {
          "type": "string",
          "fieldDescription": "\n\nThe location in the application interface where the page's link should appear. For the Atlassian application\n interface, a location is something like the coordinates on a map. It points to a particular drop-down menu or\n navigation list in the UI.\n\n Places in the Atlassian UI are identified by what are known as \"well-known locations.\"\n For example, the \"system.admin/globalsettings\" location is in the administrative\n menu link on the left side of the Administration Console.\n\n Find product locations with the web fragment finder:\n\n <ul>\n  <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder/cloud/overview\">Jira Locations</a></li>\n  <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder-confluence/cloud/overview\">Confluence locations</a></li>\n </ul>\n\n If the <code>location</code> property is not specified, a default location is used:\n\n Jira:\n\n <ul>\n <li><code>generalPage</code>: system.top.navigation.bar</li>\n <li><code>adminPage</code>: advanced\\_menu\\_section/advanced_section</li>\n </ul>\n\n Confluence:\n\n <ul>\n <li><code>generalPage</code>: system.help/pages</li>\n <li><code>adminPage</code>: system.admin/marketplace_confluence</li>\n </ul>\n\n You may wish to have no link to the page shown anywhere - for example, if you are using the page as the\n target of a <a href=\"../../jsapi/dialog/\">JavaScript API dialog</a>.\n In this case, set the value of <code>location</code> to \"none\".\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/compositeCondition"
              },
              {
                "$ref": "#/definitions/singleCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\nConditions can be added to display only when all the given conditions are true.\n\nThe supported conditions for pages are:\n\n<strong>Common conditions</strong>\n\n<ul>\n    <li><code>addon_property_exists</code></li>\n    <li><code>addon_property_equal_to</code></li>\n    <li><code>addon_property_equal_to_context</code></li>\n    <li><code>addon_property_contains_any</code></li>\n    <li><code>addon_property_contains_all</code></li>\n    <li><code>addon_property_contains_context</code></li>\n    <li><code>addon_property_contains_any_user_group</code></li>\n    <li><code>user_is_admin</code></li>\n    <li><code>user_is_logged_in</code></li>\n    <li><code>user_is_sysadmin</code></li>\n    <li><code>addon_is_licensed</code></li>\n    <li><code>feature_flag</code></li>\n</ul>\n\n<strong>Jira conditions</strong>\n\n<ul>\n    <li><code>entity_property_exists</code></li>\n    <li><code>entity_property_equal_to</code></li>\n    <li><code>entity_property_equal_to_context</code></li>\n    <li><code>entity_property_contains_any</code></li>\n    <li><code>entity_property_contains_all</code></li>\n    <li><code>entity_property_contains_context</code></li>\n    <li><code>entity_property_contains_any_user_group</code></li>\n    <li><code>can_use_application</code></li>\n    <li><code>project_type</code></li>\n    <li><code>has_global_permission</code></li>\n</ul>\n\n<strong>Confluence conditions</strong>\n\n<ul>\n    <li><code>content_property_exists</code></li>\n    <li><code>content_property_equal_to</code></li>\n    <li><code>content_property_equal_to_context</code></li>\n    <li><code>content_property_contains_any</code></li>\n    <li><code>content_property_contains_all</code></li>\n    <li><code>content_property_contains_context</code></li>\n    <li><code>content_property_contains_any_user_group</code></li>\n    <li><code>space_property_exists</code></li>\n    <li><code>space_property_equal_to</code></li>\n    <li><code>space_property_equal_to_context</code></li>\n    <li><code>space_property_contains_any</code></li>\n    <li><code>space_property_contains_all</code></li>\n    <li><code>space_property_contains_context</code></li>\n    <li><code>space_property_contains_any_user_group</code></li>\n</ul>\n\n"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nThe url to retrieve the content from.\n This must be relative to the add-on's baseUrl.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "name",
        "url",
        "key"
      ],
      "maxProperties": 10000,
      "additionalProperties": false,
      "shortClassName": "connectPageModuleBean",
      "type": "object",
      "title": "Page",
      "description": "\n\n<p>Page modules allow add-ons to insert new pages into Atlassian products. These can be automatically resized to the width\n and height of your add-on's content. The location attribute defines where links to the new page appear.</p>\n\n <p>Each type of page displays differently:</p>\n <ul>\n <li><code>generalPages</code> - have no extra styling and by default a link to the page is displayed in the main navigation menu.\n Use these pages in order to display general content.</li>\n <li><code>jiraProjectPages</code> - (<strong>Jira only</strong>) appear in the project sidebar.\n Use these pages in order to provide project-specific content. The project page module has a separate documentation page here:\n [Project Page](https://developer.atlassian.com/cloud/jira/platform/modules/project-page/).</li>\n </ul>\n\n <p>You can also define a page module to be shown when a user is administering your add-on via the\n [Universal Plugin Manager](https://confluence.atlassian.com/x/z4Q5Eg). An add-on can only define a single page of\n this type. It should each be defined in the descriptor as a single JSON object, not as a JSON array like\n other modules.</p>\n <ul>\n <li><code>postInstallPage</code> - A \"Get Started\" button will link to this page from both the add-on's entry in <em>Manage Add-ons</em>\n and from the dialog that the user is shown when they successfully install the add-on. Use this page to provide introductory\n information about the add-on to the user.</li>\n </ul>\n\n\n <!-- ## Seamless iframes -->\n\n <p>The content for a page module is injected into the Atlassian application in the form of a \"seamless\" iframe.\n Seamless iframes are regular HTML iframes but with the characteristics described below.</p>\n\n <p>As implied here, for most page content modules, you do not need to be concerned with iframe sizing.\n It's all handled for you. However, an exception exists for inline macros.</p>\n <ul>\n <li>Their size is based on the page height and width inside the iframe (i.e., no scrollbars)</li>\n <li>They are dynamically resized based on the inner content or relative browser window sizing</li>\n <li>They appear without borders, making them look like a non-iframed fragment of the page</li>\n <li>For general-pages, you can also opt to size your iframe to take up all of the host product's available vertical space (instead of resizing to its internal content).</li>\n <li>To do this, add the <code>data-options</code> attribute <code>\"sizeToParent:true\"</code> in the script tag for <code>all.js</code>. It is also possible to hide footer for such pages.</li>\n <li>For example, using <a href=\"https://bitbucket.org/atlassian/atlassian-connect-express\">ACE</a>:\n\n   <pre><code>\n&lt;script src=&quot;{{hostScriptUrl}}&quot;\n       type=&quot;text/javascript&quot;\n       data-options=&quot;sizeToParent:true;hideFooter:true&quot;&gt;\n&lt;/script&gt;\n   </code></pre></li>\n </ul>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"generalPages\": [\n          {\n            \"url\": \"/my-general-page\",\n            \"icon\": {\n              \"width\": 80,\n              \"height\": 80,\n              \"url\": \"/maps/icon.png\"\n            },\n            \"name\": {\n              \"value\": \"My General Page\"\n            },\n            \"key\": \"my-general-page\"\n          }\n        ],\n        \"postInstallPage\": {\n          \"url\": \"/my-post-install-page\",\n          \"name\": {\n            \"value\": \"My Post-Install Page\",\n            \"i18n\": \"mypostinstallpage.name\"\n          },\n          \"key\": \"my-post-install-page\"\n        }\n      }\n    }\n\n\n"
    },
    "adminPageModule": {
      "properties": {
        "icon": {
          "$ref": "#/definitions/icon",
          "fieldDescription": "\n\nAn optional icon to display with the link text or as the link, specified by URL to its hosted location.\n  You can specify a particular width and height for the icon. Most link icons in Atlassian applications\n  are 16 by 16 pixels.\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "weight": {
          "type": "integer",
          "fieldDescription": "\n\nDetermines the order in which the page's link appears in the menu or list.\n\n The \"lightest\" weight (i.e., lowest number) appears first, rising relative to other items,\n while the \"heaviest\" weights sink to the bottom of the menu or list.\n\n Built-in web items have weights that are incremented by numbers that leave room for additional\n items, such as by 10 or 100. Be mindful of the weight you choose for your item, so that it appears\n in a sensible order given existing items.\n\n",
          "defaultValue": "100"
        },
        "fullPage": {
          "type": "boolean",
          "fieldDescription": "\n\nAllows the add-on to explicitly request any product-added header, margins or padding be removed.\n Currently only takes affect on:\n <ul>\n     <li>Confluence Admin Pages</li>\n     <li>Confluence Configure Pages</li>\n </ul>\n\n",
          "defaultValue": "false"
        },
        "cacheable": {
          "type": "boolean",
          "fieldDescription": "\n\nReturns whether the URL should be cacheable. Cacheable URLs are taken directly from the add-on descriptor, and\n lack all additional query parameters:\n <ul>\n     <li>standard iframe query parameters</li>\n     <li>product context parameters</li>\n     <li>JWT token</li>\n </ul>\n\n",
          "defaultValue": "false"
        },
        "location": {
          "type": "string",
          "fieldDescription": "\n\nThe location in the application interface where the page's link should appear. For the Atlassian application\n interface, a location is something like the coordinates on a map. It points to a particular drop-down menu or\n navigation list in the UI.\n\n Places in the Atlassian UI are identified by what are known as \"well-known locations.\"\n For example, the \"system.admin/globalsettings\" location is in the administrative\n menu link on the left side of the Administration Console.\n\n Find product locations with the web fragment finder:\n\n <ul>\n  <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder/cloud/overview\">Jira Locations</a></li>\n  <li><a href=\"https://marketplace.atlassian.com/plugins/com.wittified.webfragment-finder-confluence/cloud/overview\">Confluence locations</a></li>\n </ul>\n\n If the <code>location</code> property is not specified, a default location is used:\n\n Jira:\n\n <ul>\n <li><code>generalPage</code>: system.top.navigation.bar</li>\n <li><code>adminPage</code>: advanced\\_menu\\_section/advanced_section</li>\n </ul>\n\n Confluence:\n\n <ul>\n <li><code>generalPage</code>: system.help/pages</li>\n <li><code>adminPage</code>: system.admin/marketplace_confluence</li>\n </ul>\n\n You may wish to have no link to the page shown anywhere - for example, if you are using the page as the\n target of a <a href=\"../../jsapi/dialog/\">JavaScript API dialog</a>.\n In this case, set the value of <code>location</code> to \"none\".\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/compositeCondition"
              },
              {
                "$ref": "#/definitions/singleCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\nConditions can be added to display only when all the given conditions are true.\n\nThe supported conditions for pages are:\n\n<strong>Common conditions</strong>\n\n<ul>\n    <li><code>addon_property_exists</code></li>\n    <li><code>addon_property_equal_to</code></li>\n    <li><code>addon_property_equal_to_context</code></li>\n    <li><code>addon_property_contains_any</code></li>\n    <li><code>addon_property_contains_all</code></li>\n    <li><code>addon_property_contains_context</code></li>\n    <li><code>addon_property_contains_any_user_group</code></li>\n    <li><code>user_is_admin</code></li>\n    <li><code>user_is_logged_in</code></li>\n    <li><code>user_is_sysadmin</code></li>\n    <li><code>addon_is_licensed</code></li>\n    <li><code>feature_flag</code></li>\n</ul>\n\n<strong>Jira conditions</strong>\n\n<ul>\n    <li><code>entity_property_exists</code></li>\n    <li><code>entity_property_equal_to</code></li>\n    <li><code>entity_property_equal_to_context</code></li>\n    <li><code>entity_property_contains_any</code></li>\n    <li><code>entity_property_contains_all</code></li>\n    <li><code>entity_property_contains_context</code></li>\n    <li><code>entity_property_contains_any_user_group</code></li>\n    <li><code>can_use_application</code></li>\n    <li><code>project_type</code></li>\n    <li><code>has_global_permission</code></li>\n</ul>\n\n<strong>Confluence conditions</strong>\n\n<ul>\n    <li><code>content_property_exists</code></li>\n    <li><code>content_property_equal_to</code></li>\n    <li><code>content_property_equal_to_context</code></li>\n    <li><code>content_property_contains_any</code></li>\n    <li><code>content_property_contains_all</code></li>\n    <li><code>content_property_contains_context</code></li>\n    <li><code>content_property_contains_any_user_group</code></li>\n    <li><code>space_property_exists</code></li>\n    <li><code>space_property_equal_to</code></li>\n    <li><code>space_property_equal_to_context</code></li>\n    <li><code>space_property_contains_any</code></li>\n    <li><code>space_property_contains_all</code></li>\n    <li><code>space_property_contains_context</code></li>\n    <li><code>space_property_contains_any_user_group</code></li>\n</ul>\n\n"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nThe url to retrieve the content from.\n This must be relative to the add-on's baseUrl.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "name",
        "url",
        "key"
      ],
      "maxProperties": 10000,
      "additionalProperties": false,
      "shortClassName": "adminPageModuleBean",
      "type": "object",
      "title": "Admin Page",
      "description": "\n\n<p>Admin Pages display in the administration area. Appropriate menus and other styling appear around your content.\n Use these pages in order to provide extra administration functionality.</p>\n\n <p>You can also define admin page modules to be shown when a user is administering your add-on via the\n [Universal Plugin Manager](https://confluence.atlassian.com/x/z4Q5Eg). An add-on can only define a single page of\n each of these types. They should each be defined in the descriptor as a single JSON object, not as a JSON array like\n other modules.</p>\n <ul>\n <li><code>configurePage</code> - a \"Configure\" button will link to this page from the add-on's entry in <em>Manage Add-ons</em>.\n Use this page to provide configuration of the add-on itself.</li>\n </ul>\n\n\n <!-- ## Seamless iframes -->\n\n <p>The content for an admin page module is injected into the Atlassian application in the form of a \"seamless\" iframe.\n Seamless iframes are regular HTML iframes but with the characteristics described below.</p>\n\n <p>As implied here, for most admin page content modules, you do not need to be concerned with iframe sizing.\n It's all handled for you. However, an exception exists for inline macros.</p>\n <ul>\n <li>Their size is based on the page height and width inside the iframe (i.e., no scrollbars)</li>\n <li>They are dynamically resized based on the inner content or relative browser window sizing</li>\n <li>They appear without borders, making them look like a non-iframed fragment of the page</li>\n <li>For admin pages, you can also opt to size your iframe to take up all of the host product's available vertical space (instead of resizing to its internal content).</li>\n <li>To do this, add the <code>data-options</code> attribute <code>\"sizeToParent:true\"</code> in the script tag for <code>all.js</code>. It is also possible to hide footer for such pages.</li>\n <li>For example, using <a href=\"https://bitbucket.org/atlassian/atlassian-connect-express\">ACE</a>:\n\n   <pre><code>\n&lt;script src=&quot;{{hostScriptUrl}}&quot;\n       type=&quot;text/javascript&quot;\n       data-options=&quot;sizeToParent:true;hideFooter:true&quot;&gt;\n&lt;/script&gt;\n   </code></pre></li>\n </ul>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"adminPages\": [\n          {\n            \"url\": \"/my-admin-page\",\n            \"name\": {\n              \"value\": \"My Admin Page\"\n            },\n            \"key\": \"my-admin-page\"\n          }\n        ],\n        \"configurePage\": {\n          \"url\": \"/my-config-page\",\n          \"name\": {\n            \"value\": \"My Configure Page\"\n          },\n          \"key\": \"my-config-page\"\n        }\n      }\n    }\n\n\n"
    },
    "dialogModuleOptions": {
      "properties": {
        "key": {
          "type": "string",
          "fieldDescription": "\n\n<p>The key of a <a href=\"../dialog/\">Dialog</a> module declared in this Connect add-on.</p>\n\n <p>\n The dialog module will include the <a href=\"../dialog-options/\">Dialog Options</a>\n that would otherwise need to be specified directly in this options object.\n </p>\n\n"
        }
      },
      "required": [
        "key"
      ],
      "shortClassName": "dialogModuleOptions",
      "type": "object",
      "title": "Dialog Module Options",
      "description": "\n\nOptions for a web-item targeting a common <a href=\"../dialog/\">dialog module</a>.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"target\": {\n        \"type\": \"dialogmodule\",\n        \"options\": {\n          \"key\": \"dialog-module-key\"\n        }\n      }\n    }\n\n\n"
    },
    "developmentToolModuleActionsBean": {
      "properties": {
        "createBranch": {
          "properties": {
            "templateUrl": {
              "format": "uri-template",
              "type": "string",
              "fieldDescription": "\n\n"
            }
          },
          "required": [
            "templateUrl"
          ],
          "shortClassName": "developmentToolModuleActionBean",
          "type": "object",
          "description": "\n\n<p>Defines the URL template that is used when an action is invoked. The following context parameters are supported: <code>{issue.key}</code>, <code>{issue.summary}</code>.</p>\n\n",
          "fieldDescription": "\n\n"
        }
      },
      "shortClassName": "developmentToolModuleActionsBean",
      "type": "object",
      "title": "Development Actions",
      "description": "\n\n<p>Development actions that can be performed by Jira users.</p>\n<p>Each action is optional (unless indicated otherwise). The absence of an action indicates that the action is not supported by the provider.</p>\n\n"
    },
    "featureFlagProviderActionsBean": {
      "properties": {
        "linkFlag": {
          "properties": {
            "templateUrl": {
              "format": "uri-template",
              "type": "string",
              "fieldDescription": "\n\n"
            }
          },
          "required": [
            "templateUrl"
          ],
          "shortClassName": "featureFlagProviderActionBean",
          "type": "object",
          "description": "\n\n<p>Defines the URL template that is used when an action is invoked. The following context parameters are supported: <code>{issue.key}</code>, <code>{issue.summary}</code>, <code>{issue.flags}</code>.</p>\n\n",
          "fieldDescription": "\n\nAction for linking an existing feature flag to a Jira issue.\n\n"
        },
        "createFlag": {
          "properties": {
            "templateUrl": {
              "format": "uri-template",
              "type": "string",
              "fieldDescription": "\n\n"
            }
          },
          "required": [
            "templateUrl"
          ],
          "shortClassName": "featureFlagProviderActionBean",
          "type": "object",
          "description": "\n\n<p>Defines the URL template that is used when an action is invoked. The following context parameters are supported: <code>{issue.key}</code>, <code>{issue.summary}</code>, <code>{issue.flags}</code>.</p>\n\n",
          "fieldDescription": "\n\nAction for creating a feature flag and linking it with a Jira issue.\n\n"
        },
        "listFlags": {
          "properties": {
            "templateUrl": {
              "format": "uri-template",
              "type": "string",
              "fieldDescription": "\n\n"
            }
          },
          "required": [
            "templateUrl"
          ],
          "shortClassName": "featureFlagProviderActionBean",
          "type": "object",
          "description": "\n\n<p>Defines the URL template that is used when an action is invoked. The following context parameters are supported: <code>{issue.key}</code>, <code>{issue.summary}</code>, <code>{issue.flags}</code>.</p>\n\n",
          "fieldDescription": "\n\nAction for showing all linked feature flags, when there are multiple feature flags linked to a Jira issue.\n\n"
        }
      },
      "shortClassName": "featureFlagProviderActionsBean",
      "type": "object",
      "title": "Feature Flag Actions",
      "description": "\n\n<p>Feature flag actions that can be performed by Jira users.</p>\n<p>Each action is optional (unless indicated otherwise). The absence of an action indicates that the action is not supported by the provider.</p>\n\n"
    },
    "issueGlance": {
      "properties": {
        "icon": {
          "$ref": "#/definitions/icon",
          "fieldDescription": "\n\nSpecifies an icon to display at the left of the glance view control.\n The icon resource provided in this field should be 24x24 pixels or larger, preferably in SVG format.\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/singleCondition"
              },
              {
                "$ref": "#/definitions/compositeCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
        },
        "content": {
          "type": "object",
          "fieldDescription": "\n\nThis content becomes the label next to the icon. It's handy for communicating a small amount of information.\n\n Read about [Issue Glance Content Label](/cloud/jira/platform/modules/issue-glance-content-label/).\n\n",
          "anyOf": [
            {
              "properties": {
                "label": {
                  "$ref": "#/definitions/i18nProperty",
                  "fieldDescription": "\n\n"
                },
                "type": {
                  "enum": [
                    "label",
                    "LABEL"
                  ],
                  "type": "string",
                  "fieldDescription": "\n\nThe type field must be set to 'label'\n\n"
                }
              },
              "required": [
                "label",
                "type"
              ],
              "shortClassName": "issueGlanceContentLabelBean",
              "type": "object",
              "title": "Issue Glance Content Label",
              "description": "\n\nDescribes the content for the issue glance module. It specifies static text to show inside the glance, which is left-aligned next to the icon.\n\n"
            }
          ]
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        },
        "target": {
          "type": "object",
          "fieldDescription": "\n\nSpecifies the target action when clicking on the glance.\n\n Read about [Issue Glance Target Web Panel](/cloud/jira/platform/modules/issue-glance-target-web-panel/).\n\n",
          "anyOf": [
            {
              "properties": {
                "type": {
                  "enum": [
                    "web_panel",
                    "WEB_PANEL"
                  ],
                  "type": "string",
                  "fieldDescription": "\n\nThe type field must be set to 'web_panel'\n\n"
                },
                "url": {
                  "format": "uri-template",
                  "type": "string",
                  "fieldDescription": "\n\nThe URL of the app resource that provides the web panel content. This URL must be relative to the app's baseUrl.\n\n"
                }
              },
              "required": [
                "type",
                "url"
              ],
              "shortClassName": "issueGlanceTargetWebPanelBean",
              "type": "object",
              "title": "Issue Glance Target Web Panel",
              "description": "\n\nDescribes the target of the issue glance module. This supports displaying a web panel in the context area of the issue.\n\n"
            }
          ]
        }
      },
      "required": [
        "icon",
        "name",
        "content",
        "key",
        "target"
      ],
      "additionalProperties": true,
      "shortClassName": "issueGlanceModuleBean",
      "type": "object",
      "title": "Issue Glance",
      "description": "\n\n<p>This module adds a special user interface element that appears in the right side of the <a href=\"https://confluence.atlassian.com/jiracorecloud/the-new-jira-issue-view-938040503.html\">new Jira issue view</a> under the status and alongside other fields like the assignee, priority, and labels.</p>\n<p>Glances provide a quick way for a user to get an overview of some information, provided by your app, that relates to an issue.</p>\n<p>The Glance object (which includes your icon, content and URL) is defined using the Issue Glance module.</p>\n\n<h3>Setting the status for a Glance</h3>\n<p>The status of a Glance for a specific an issue can be set using the <a href=\"/cloud/jira/platform/rest/#api-api-2-issue-issueIdOrKey-properties-propertyKey-put\">Set issue property API</a>.</p>\n<p>The issue property key needs to be formatted as <code>com.atlassian.jira.issue:[addonKey]:[moduleKey]:status</code> to set the status.</p>\n<p>The JSON in your PUT request to set the status should follow this format depending on the type of status you wish you display:</p>\n <ul>\n   <li><strong>Lozenge:</strong> <code>{ type: 'lozenge', value: { label: 'Hello', type: 'default' } }</code>. For available lozenge types, refer to <a href=\"https://atlaskit.atlassian.com/packages/core/lozenge\">lozenge appearance</a>.</li>\n   <li><strong>Icon:</strong> <code>{ type: 'icon', value: { label: '/img/tick.png' } }</code>. Note that label is the URL relative to your app's base URL.</li>\n   <li><strong>Badge:</strong> <code>{ type: 'badge', value: { label: '123' } }</code>. Note that label must be a numeric string.</li>\n </ul>\n<p>More recommended usage and user experience suggestions are available in the <a href=\"/cloud/jira/platform/issue-view/\">design guidelines</a>.</p>\n\n<h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraIssueGlances\": [\n          {\n            \"icon\": {\n              \"width\": 0,\n              \"height\": 0,\n              \"url\": \"my_icon.svg\"\n            },\n            \"content\": {\n              \"type\": \"label\",\n              \"label\": {\n                \"value\": \"my label\"\n              }\n            },\n            \"target\": {\n              \"type\": \"web_panel\",\n              \"url\": \"/panel_url\"\n            },\n            \"name\": {\n              \"value\": \"My Issue Glance \"\n            },\n            \"key\": \"my-issue-glance\"\n          }\n        ]\n      }\n    }\n\n\n\n\n <h2><code>ISSUE\\_GLANCE\\_OPENED</code> event</h2>\n <p>When a user clicks a glance, the glance panel slides in and covers the details on the right side of the issue. The <code>ISSUE\\_GLANCE\\_OPENED</code> event is sent. which you can listen for using the <a href=\"/cloud/jira/platform/about-the-javascript-api/\">JavaScript API</a>. See the example provided below.</p>\n\n <pre><code>AP.events.on('ISSUE\\_GLANCE\\_OPENED', function() {\n        // You can decide the logic here in add-on.\n  });</code></pre>\n\n <p>You can use this to load additional web resource or trigger activity in your add-on.</p>\n <p>More recommended usage and user experience suggestions are available in the <a href=\"/cloud/jira/platform/issue-view/\">design guidelines</a>.</p>\n\n"
    },
    "issueContent": {
      "properties": {
        "icon": {
          "$ref": "#/definitions/icon",
          "fieldDescription": "\n\nSpecifies an icon to show alongside the quick-add menu item.\n The icon should be 24x24 pixels or larger, preferably in .SVG format.\n\n"
        },
        "tooltip": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nSpecifies a tooltip for the quick-add menu item.\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/singleCondition"
              },
              {
                "$ref": "#/definitions/compositeCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        },
        "target": {
          "type": "object",
          "fieldDescription": "\n\nSpecifies the target of this content as a result of clicking on the menu item. Currently,\n you can only display a web panel in the issue's content area.\n\n Read about [Issue Page Target Web Panel](/cloud/jira/platform/modules/issue-page-target-web-panel/).\n\n",
          "anyOf": [
            {
              "properties": {
                "type": {
                  "enum": [
                    "web_panel",
                    "WEB_PANEL"
                  ],
                  "type": "string",
                  "fieldDescription": "\n\nThe type field must be set to 'web_panel'\n\n"
                },
                "url": {
                  "format": "uri-template",
                  "type": "string",
                  "fieldDescription": "\n\nThe URL of the add-on resource that provides the web panel content.\n This URL must be relative to the app's baseUrl.\n\n"
                }
              },
              "required": [
                "type",
                "url"
              ],
              "shortClassName": "issuePageTargetWebPanelBean",
              "type": "object",
              "title": "Issue Page Target Web Panel",
              "description": "\n\nDescribes the target of the issue content module. Supports displaying a web panel in the content area of the issue view.\n\n"
            }
          ]
        },
        "contentPresentConditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/singleCondition"
              },
              {
                "$ref": "#/definitions/compositeCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\nSpecifies a list of [Conditions](/cloud/jira/platform/conditions/) that, when resolved to true, will\n force the content to always be displayed for that issue. Users have the ability to collapse the content\n if they don't want to see it.\n\n"
        }
      },
      "required": [
        "icon",
        "tooltip",
        "name",
        "key",
        "target"
      ],
      "additionalProperties": true,
      "shortClassName": "issueContentModuleBean",
      "type": "object",
      "title": "Issue Content",
      "description": "\n\n<p>This module adds a quick-add button alongside the existing quick-add buttons for attachments, subtasks, and linked issues in the <a href=\"https://confluence.atlassian.com/jiracorecloud/the-new-jira-issue-view-938040503.html\">new Jira issue view</a>. Users will use your quick-add button to add content to help describe, and ultimately resolve, an issue.</p>\n <p>When a user clicks on your app's quick-add button, a panel is added below the issue description that displays content from a URL provided by your app (similar to the <a href=\"/cloud/jira/platform/modules/web-panel/\">web panel module</a>). This URL must be a relative URL from your app's server.</p>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraIssueContents\": [\n          {\n            \"icon\": {\n              \"width\": 0,\n              \"height\": 0,\n              \"url\": \"/my_icon.svg\"\n            },\n            \"target\": {\n              \"type\": \"web_panel\",\n              \"url\": \"/url_to_panel_content_page.htm\"\n            },\n            \"tooltip\": {\n              \"value\": \"This is a tooltip\"\n            },\n            \"contentPresentConditions\": [\n              {\n                \"condition\": \"user_is_admin\",\n                \"invert\": false\n              }\n            ],\n            \"name\": {\n              \"value\": \"My Issue Content Panel\"\n            },\n            \"key\": \"my-issue-content-panel\"\n          }\n        ]\n      }\n    }\n\n\n\n\n <h2><code>ISSUE\\_QUICK\\_ADD\\_CLICKED</code> event</h2>\n <p>When a user clicks your quick-add button, the <code>ISSUE\\_QUICK\\_ADD\\_CLICKED</code> event is sent. You can listen for this event using the <a href=\"/cloud/jira/platform/about-the-javascript-api/\">JavaScript API</a>. Here's an example:</p>\n\n <pre><code>AP.events.on('ISSUE\\_QUICK\\_ADD\\_CLICKED', function(event){\n  // display a dialog when quick add button was clicked. event = { isNewToIssue: boolean }\n  // isNewToIssue is true if this is first time content panel being added to current issue.\n  // isNewToIssue is false if content panel is already on issue view, and it is selected.\n  AP.dialog.create({\n        key: 'sized-panel',\n        width: '500px',\n        height: '200px',\n        chrome: true,\n        header: JSON.stringify(event)\n  });\n });</code></pre>\n\n <p>You can use this to design an experience where you want a user to input, select, or review information before interacting with your web panel.</p>\n <p>Find out more about recommended usage and get user experience suggestions in the <a href=\"/cloud/jira/platform/issue-view/\">design guidelines</a>.</p>\n\n"
    },
    "projectAdminTabPanel": {
      "properties": {
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "weight": {
          "type": "integer",
          "fieldDescription": "\n\n<p>Determines the order in which the tab panel's link appears in the menu or list.</p>\n\n <p>The \"lightest\" weight (i.e., lowest number) appears first, rising relative to other items,\n while the \"heaviest\" weights sink to the bottom of the menu or list.</p>\n\n <p>Built-in web items have weights that are incremented by numbers that leave room for additional\n items, such as by 10 or 100. Be mindful of the weight you choose for your item, so that it appears\n in a sensible order given existing items.</p>\n\n"
        },
        "location": {
          "type": "string",
          "fieldDescription": "\n\nThe name of the group of tabs in the project configuration where the tab panel should appear.\n The following are accepted values.\n\n * `projectgroup1`\n * `projectgroup2`\n * `projectgroup3`\n * `projectgroup4`\n\nSee [Project Configuration Locations](https://developer.atlassian.com/jiradev/jira-architecture/web-fragments/project-configuration-locations#ProjectConfigurationLocations-AddingNewItemstoExistingWebSections) for details.\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/compositeCondition"
              },
              {
                "$ref": "#/definitions/singleCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nSpecifies the URL targeted by the tab panel. The URL is relative to the add-on's base URL.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "name",
        "url",
        "key"
      ],
      "shortClassName": "connectProjectAdminTabPanelModuleBean",
      "type": "object",
      "title": "Project Admin Tab Panel",
      "description": "\n\nProject administration tab panel modules add a new tab and corresponding page to the left hand menu on the Jira\n project settings (previously called project administration) page.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraProjectAdminTabPanels\": [\n          {\n            \"location\": \"projectgroup4\",\n            \"url\": \"/my-admin-panel\",\n            \"weight\": 100,\n            \"name\": {\n              \"value\": \"Admin Panel\"\n            },\n            \"key\": \"admin-panel\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "url": {
      "properties": {
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\n"
        }
      },
      "required": [
        "url"
      ],
      "shortClassName": "urlBean",
      "type": "object",
      "title": "URL",
      "description": "\n\n"
    },
    "workflowValidator": {
      "properties": {
        "view": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the app page that shows the read-only configuration or summary of the workflow validator.\n\n The view URL can contain the following context parameters:\n\n - `validator.id`: The unique identifier of the validator.\n - `validator.config`: The configuration value saved to Jira after calling `WorkflowConfiguration.onSave`.\n\n"
        },
        "expression": {
          "type": "string",
          "fieldDescription": "\n\nThe [Jira expression](https://developer.atlassian.com/cloud/jira/platform/rest/v3/#api-api-3-expression-eval-post)\n used to evaluate the validator. Must return a boolean value.\n <p>\n This expression can be overridden using the configuration page.\n If you return configuration with property \"expression\", then that expression will be used\n to evaluate the validator instead of the expression defined here. For example:\n\n <pre><code>AP.require([\"jira\"], function(jira) {\n    jira.WorkflowConfiguration.onSave(function() {\n        var config = {\n            \"expression\": \"dynamically built expression\"\n        };\n        return JSON.stringify(config);\n    });\n});</code></pre>\n\n"
        },
        "edit": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the app page that allows to configure the workflow validator once it exists.\n\n The edit URL can contain the following context parameters:\n\n - `validator.id`: The unique identifier of the validator.\n - `validator.config`: The configuration value saved to Jira after calling `WorkflowConfiguration.onSave`.\n\n"
        },
        "errorMessage": {
          "type": "object",
          "fieldDescription": "\n\nThe error message that will be shown if the validator rejects the transition.\n <p>\n This can be either a static [i18n property](../i18n-property/), or an object containing the \"expression\" property,\n with a Jira expression that returns the error message dynamically, based on the current transition or configuration.\n\n",
          "anyOf": [
            {
              "properties": {
                "value": {
                  "type": "string",
                  "fieldDescription": "\n\nThe human-readable default value. This will be used if no translation exists.\n\n"
                },
                "i18n": {
                  "type": "string",
                  "fieldDescription": "\n\nThe localization key for the human-readable value.\n <a href=\"../../internationalization/\">Translations</a> for the keys are defined at the top level of the\n <a href=\"../../add-on-descriptor/\">add-on descriptor</a>.\n\n"
                }
              },
              "required": [
                "value"
              ],
              "shortClassName": "validatorI18nErrorMessage",
              "type": "object",
              "title": "i18n Property",
              "description": "\n\nRepresents a string that can be resolved via a localization properties file. You can use the same `i18n Property` key\n and value in multiple places if you like, but identical keys must have identical values.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"name\": {\n        \"value\": \"My Label\"\n      }\n    }\n\n\n"
            },
            {
              "properties": {
                "expression": {
                  "type": "string",
                  "fieldDescription": "\n\nThe Jira expression that will return an error message if the validator rejects a transition.\n\n"
                }
              },
              "required": [
                "expression"
              ],
              "shortClassName": "validatorJiraExpressionErrorMessage",
              "type": "object",
              "title": "Jira Expression Error Message",
              "description": "\n\nA Jira expression that will be evaluated if the workflow validator fails.\n The string returned by the Jira expression will be displayed as the error message for the failed transition.\n\n"
            }
          ]
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "description": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nThe description of the workflow validator. This will be presented to the user when they add a new validator to a Jira workflow.\n\n"
        },
        "create": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the app page that allows to configure the workflow validator on creation.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "expression",
        "errorMessage",
        "name",
        "key"
      ],
      "shortClassName": "workflowValidatorModuleBean",
      "type": "object",
      "title": "Workflow Validator",
      "description": "\n\nThis module defines a validator that can be added to workflow transitions\n (see: <a href=\"https://confluence.atlassian.com/adminjiracloud/advanced-workflow-configuration-776636620.html\">Advanced workflow configuration</a>).\n <p>\n Validators check that any input made to the transition is valid before the transition is performed.\n Input can include that gathered from the user on the transition's screen. If a validator fails,\n the issue does not progress to the destination status of the transition, the transition's post functions are not executed\n and the error message of the failed validator is shown.\n <p>\n Validators added by apps are implemented with [Jira expressions](../../jira-expressions)\n that are provided upfront in the descriptor or built dynamically on the configuration page.\n <p>\n A workflow validator only evaluates to true if the provided Jira expression evaluates to true. It will evaluate to false in all other cases, including:\n <ul>\n  <li>The Jira expression fails to evaluate because of errors.</li>\n  <li>The Jira expression returns anything other than a boolean value.</li>\n  <li>The app providing the workflow validator is uninstalled.</li>\n </ul>\n\n <h2>Configuration</h2>\n\n Often, workflow validators will require some degree of configuration of their behavior. For example,\n you may want to allow a state transition only if the issue has a particular label, and you want the project\n administrator to configure that label. For this purpose, three additional URLs in the descriptor\n allow you to declare the pages that will show:\n\n <ul>\n  <li>the form that is shown when a workflow validator is first created.</li>\n  <li>the form that is shown when a workflow validator is edited.</li>\n  <li>the read-only view or summary of the configuration.</li>\n </ul>\n\n All URLs must be relative to the base URL of the Connect app.\n\n <h3>Creating and editing a validator</h3>\n\nThe create and edit pages should present a form with configuration relevant to the validator. In order to\n persist this information in Jira, the page needs to use the [javascript API](../../jsapi/classes/workflowconfiguration/),\n as shown below:\n\n      AP.require([\"jira\"], function(jira) {\n          // When the configuration is saved, this method is called. Return the configuration based on your input elements.\n          jira.WorkflowConfiguration.onSave(function() {\n              var config = {\n                  \"key\": \"val\"\n              };\n              return JSON.stringify(config); // object returned here will be available under the `config` context variable in the Jira expression\n          });\n\n          // Validate any appropriate input and return true/false\n          jira.WorkflowConfiguration.onSaveValidation(function() {\n              return true;\n          });\n      });\n\n When evaluating the validator, configuration saved that way will be available to the Jira expression under the\n `config` context variable.\n\n Additionally, instead of just providing an additional context variable,\n you can override the entire Jira expression from the descriptor.\n To do that, include the \"expression\" property in the returned object, for example:\n\n <pre><code>AP.require([\"jira\"], function(jira) {\n    jira.WorkflowConfiguration.onSave(function() {\n        var config = {\n            \"expression\": \"dynamically built expression\"\n        };\n    return JSON.stringify(config);\n    });\n});\n</code></pre>\n\n <h2>Context variables</h2>\n\n The following context variables are available to expressions:\n  <ul>\n   <li>`user` ([User](../../jira-expressions-type-reference#user)): The user evaluating the validator.</li>\n   <li>`app` ([App](../../jira-expressions-type-reference#app)): The app that provided the validator.</li>\n   <li>`issue` ([Issue](../../jira-expressions-type-reference#issue)): The issue that is about to be transitioned. Includes changes made on the transition screen.</li>\n   <li>`project` ([Project](../../jira-expressions-type-reference#project)): The project the issue belongs to.</li>\n   <li>`transition` ([Transition](../../jira-expressions-type-reference#transition)): The transition that the validator is being evaluated against.</li>\n   <li>`config` ([JSON](../../jira-expressions-type-reference#map)): The configuration saved on the configuration page using the [javascript API](../../jsapi/classes/workflowconfiguration/).</li>\n  </ul>\n\n  Additionally, these are available for Jira Service Desk transitions:\n  <ul>\n   <li>`customerRequest` ([CustomerRequest](../../jira-expressions-type-reference#customerrequest)): The customer request that is about to be transitioned.</li>\n   <li>`serviceDesk` ([ServiceDesk](../../jira-expressions-type-reference#servicedesk)): The service desk the customer request belongs to.</li>\n  </ul>\n\n <h2>Example</h2>\n\n The following example declares a validator for a transition. The validator only allows the transition if:\n <ul>\n  <li>The saved configuration object has a string property named \"format-regex\".</li>\n  <li>The issue has a summary that matches the regular expression from the configuration.</li>\n </ul>\n\n The example uses the `issue` context variable to get the summary of the current issue\n and the `config` context variable to retrieve the regular expression from the saved configuration.\n\n For a full end-to-end example of how to use and implement configuration pages,\n see the [Workflow Condition and Validators Example](https://bitbucket.org/atlassianlabs/atlassian-connect-jira-workflow-condition-validator-example) app.\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraWorkflowValidators\": [\n          {\n            \"description\": {\n              \"value\": \"This validator will allow the transition only if the summary has the configured format.\"\n            },\n            \"expression\": \"issue.summary.match(config['format-regex']) != null\",\n            \"errorMessage\": {\n              \"expression\": \"'Issue summary has to be in the following format: ' + config['format-regex']\"\n            },\n            \"view\": {\n              \"url\": \"/view\"\n            },\n            \"edit\": {\n              \"url\": \"/edit\"\n            },\n            \"create\": {\n              \"url\": \"/create\"\n            },\n            \"name\": {\n              \"value\": \"Summary has the correct format\"\n            },\n            \"key\": \"workflow-validator-example\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "workflowCondition": {
      "properties": {
        "view": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the app page that shows the read-only configuration or summary of the workflow condition.\n\n The view URL can contain the following context parameters:\n\n - `condition.id`: The unique identifier of the condition.\n - `condition.config`: The configuration value saved to Jira after calling `WorkflowConfiguration.onSave`.\n\n"
        },
        "expression": {
          "type": "string",
          "fieldDescription": "\n\nThe [Jira expression](https://developer.atlassian.com/cloud/jira/platform/rest/v3/#api-api-3-expression-eval-post)\n used to evaluate the condition. Must return a boolean value.\n <p>\n This expression can be overridden using the configuration page.\n If you return configuration with property \"expression\", then that expression will be used\n to evaluate the condition instead of the expression defined here. For example:\n\n <pre><code>AP.require([\"jira\"], function(jira) {\n    jira.WorkflowConfiguration.onSave(function() {\n        var config = {\n            \"expression\": \"dynamically built expression\"\n        };\n        return JSON.stringify(config);\n    });\n});</code></pre>\n\n"
        },
        "edit": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the app page that allows to configure the workflow condition once it exists.\n\n The edit URL can contain the following context parameters:\n\n - `condition.id`: The unique identifier of the condition.\n - `condition.config`: The configuration value saved to Jira after calling `WorkflowConfiguration.onSave`.\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "description": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nThe description of the workflow condition. This will be presented to the user when they add a new condition to a Jira workflow.\n\n"
        },
        "create": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the app page that allows to configure the workflow condition on creation.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "expression",
        "name",
        "key"
      ],
      "shortClassName": "workflowConditionModuleBean",
      "type": "object",
      "title": "Workflow Condition",
      "description": "\n\nThis module defines a condition that can be added to workflow transitions\n (see: <a href=\"https://confluence.atlassian.com/adminjiracloud/advanced-workflow-configuration-776636620.html\">Advanced workflow configuration</a>).\n <p>\n Conditions control whether the user can execute a transition.\n If a condition fails, the user won't be able to execute the transition.\n For example, the user won't see the transition button on the <i>View issue</i> page.\n <p>\n Conditions added by apps are implemented with [Jira expressions](../../jira-expressions)\n that are provided upfront in the descriptor or built dynamically on the configuration page.\n <p>\n A workflow condition only evaluates to true if the provided Jira expression evaluates to true. It will evaluate to false in all other cases, including:\n <ul>\n  <li>The Jira expression fails to evaluate because of errors.</li>\n  <li>The Jira expression returns anything other than a boolean value.</li>\n  <li>The app providing the workflow condition is uninstalled.</li>\n </ul>\n\n <h2>Configuration</h2>\n\n Often, workflow conditions will require some degree of configuration of their behavior. For example,\n you may want to allow a state transition only if the issue has a particular label, and you want the project\n administrator to configure that label. For this purpose, three additional URLs in the descriptor\n allow you to declare the pages that will show:\n\n <ul>\n  <li>the form that is shown when a workflow condition is first created.</li>\n  <li>the form that is shown when a workflow condition is edited.</li>\n  <li>the read-only view or summary of the configuration.</li>\n </ul>\n\n All URLs must be relative to the base URL of the Connect app.\n\n <h3>Creating and editing a condition</h3>\n\nThe create and edit pages should present a form with configuration relevant to the condition. In order to\n persist this information in Jira, the page needs to use the [javascript API](../../jsapi/classes/workflowconfiguration/),\n as shown below:\n\n      AP.require([\"jira\"], function(jira) {\n          // When the configuration is saved, this method is called. Return the configuration based on your input elements.\n          jira.WorkflowConfiguration.onSave(function() {\n              var config = {\n                  \"key\": \"val\"\n              };\n              return JSON.stringify(config); // object returned here will be available under the `config` context variable in the Jira expression\n          });\n\n          // Validate any appropriate input and return true/false\n          jira.WorkflowConfiguration.onSaveValidation(function() {\n              return true;\n          });\n      });\n\n When evaluating the condition, configuration saved that way will be available to the Jira expression under the\n `config` context variable.\n\n Additionally, instead of just providing an additional context variable,\n you can override the entire Jira expression from the descriptor.\n To do that, include the \"expression\" property in the returned object, for example:\n\n <pre><code> AP.require([\"jira\"], function(jira) {\n    jira.WorkflowConfiguration.onSave(function() {\n        var config = {\n            \"expression\": \"dynamically built expression\"\n        };\n        return JSON.stringify(config);\n    });\n});\n</code></pre>\n\n <h2>Context variables</h2>\n\n The following context variables are available to expressions:\n  <ul>\n   <li>`user` ([User](../../jira-expressions-type-reference#user)): The user evaluating the condition.</li>\n   <li>`app` ([App](../../jira-expressions-type-reference#app)): The app that provided the condition.</li>\n   <li>`issue` ([Issue](../../jira-expressions-type-reference#issue)): The issue selected for transition.</li>\n   <li>`project` ([Project](../../jira-expressions-type-reference#project)): The project the issue belongs to.</li>\n   <li>`transition` ([Transition](../../jira-expressions-type-reference#transition)): The transition that the condition is being evaluated against.</li>\n   <li>`config` ([JSON](../../jira-expressions-type-reference#map)): The configuration saved on the configuration page using the [javascript API](../../jsapi/classes/workflowconfiguration/).</li>\n  </ul>\n\n  Additionally, these are available for Jira Service Desk transitions:\n  <ul>\n   <li>`customerRequest` ([CustomerRequest](../../jira-expressions-type-reference#customerrequest)): The customer request selected for transition.</li>\n   <li>`serviceDesk` ([ServiceDesk](../../jira-expressions-type-reference#servicedesk)): The service desk the customer request belongs to.</li>\n  </ul>\n\n <h2>Example</h2>\n\n The following example declares a condition for a transition. The condition only allows the transition if:\n <ul>\n  <li>The saved configuration object has a property `allowedIssueTypes` which is a list of numbers.</li>\n  <li>The issue type ID is included in the list from the configuration.</li>\n </ul>\n\n The example uses the `issue` context variable to get the current issue type\n and the `config` context variable to retrieve the list of allowed issue types from the saved configuration.\n\n For a full end-to-end example of how to use and implement configuration pages,\n see the [Workflow Condition and Validators Example](https://bitbucket.org/atlassianlabs/atlassian-connect-jira-workflow-condition-validator-example) app.\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraWorkflowConditions\": [\n          {\n            \"description\": {\n              \"value\": \"This conditions allows the transition only if the issue is one of the configured issue types.\"\n            },\n            \"expression\": \"config.allowedIssueTypes.includes(issue.issueType.id)\",\n            \"view\": {\n              \"url\": \"/view\"\n            },\n            \"edit\": {\n              \"url\": \"/edit\"\n            },\n            \"create\": {\n              \"url\": \"/create\"\n            },\n            \"name\": {\n              \"value\": \"Issue type is valid\"\n            },\n            \"key\": \"workflow-condition-example\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "issuePageTargetWebPanel": {
      "properties": {
        "type": {
          "enum": [
            "web_panel",
            "WEB_PANEL"
          ],
          "type": "string",
          "fieldDescription": "\n\nThe type field must be set to 'web_panel'\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nThe URL of the add-on resource that provides the web panel content.\n This URL must be relative to the app's baseUrl.\n\n"
        }
      },
      "required": [
        "type",
        "url"
      ],
      "shortClassName": "issuePageTargetWebPanelBean",
      "type": "object",
      "title": "Issue Page Target Web Panel",
      "description": "\n\nDescribes the target of the issue content module. Supports displaying a web panel in the content area of the issue view.\n\n"
    },
    "jiraExpressionErrorMessage": {
      "properties": {
        "expression": {
          "type": "string",
          "fieldDescription": "\n\nThe Jira expression that will return an error message if the validator rejects a transition.\n\n"
        }
      },
      "required": [
        "expression"
      ],
      "shortClassName": "validatorJiraExpressionErrorMessage",
      "type": "object",
      "title": "Jira Expression Error Message",
      "description": "\n\nA Jira expression that will be evaluated if the workflow validator fails.\n The string returned by the Jira expression will be displayed as the error message for the failed transition.\n\n"
    },
    "issueGlanceContentLabel": {
      "properties": {
        "label": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\n"
        },
        "type": {
          "enum": [
            "label",
            "LABEL"
          ],
          "type": "string",
          "fieldDescription": "\n\nThe type field must be set to 'label'\n\n"
        }
      },
      "required": [
        "label",
        "type"
      ],
      "shortClassName": "issueGlanceContentLabelBean",
      "type": "object",
      "title": "Issue Glance Content Label",
      "description": "\n\nDescribes the content for the issue glance module. It specifies static text to show inside the glance, which is left-aligned next to the icon.\n\n"
    },
    "report": {
      "properties": {
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "description": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human-readable description of this report module. This description is displayed on the reports list.\n\n"
        },
        "reportCategory": {
          "enum": [
            "agile",
            "AGILE",
            "issue_analysis",
            "ISSUE_ANALYSIS",
            "forecast_management",
            "FORECAST_MANAGEMENT",
            "other",
            "OTHER"
          ],
          "type": "string",
          "fieldDescription": "\n\nThe category of the report. The default category is other.\n\n",
          "defaultValue": "other"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nSpecifies the URL targeted by the report. The URL is relative to the add-on's base URL.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        },
        "thumbnailUrl": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nSpecifies the URL of the report thumbnail. The URL is relative to the add-on's base URL.\n\n"
        }
      },
      "required": [
        "name",
        "description",
        "url",
        "key"
      ],
      "shortClassName": "reportModuleBean",
      "type": "object",
      "title": "Report",
      "description": "\n\nAllow add-ons to define a new report, which is linked from a project page.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraReports\": [\n          {\n            \"url\": \"/report?projectKey={project.key}\",\n            \"description\": {\n              \"value\": \"This is an example report\"\n            },\n            \"reportCategory\": \"agile\",\n            \"thumbnailUrl\": \"http://example.com/images/report-example-thumbnail.png\",\n            \"name\": {\n              \"value\": \"Example Report\"\n            },\n            \"key\": \"report-example\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "issueGlanceTargetWebPanel": {
      "properties": {
        "type": {
          "enum": [
            "web_panel",
            "WEB_PANEL"
          ],
          "type": "string",
          "fieldDescription": "\n\nThe type field must be set to 'web_panel'\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nThe URL of the app resource that provides the web panel content. This URL must be relative to the app's baseUrl.\n\n"
        }
      },
      "required": [
        "type",
        "url"
      ],
      "shortClassName": "issueGlanceTargetWebPanelBean",
      "type": "object",
      "title": "Issue Glance Target Web Panel",
      "description": "\n\nDescribes the target of the issue glance module. This supports displaying a web panel in the context area of the issue.\n\n"
    },
    "i18nErrorMessage": {
      "properties": {
        "value": {
          "type": "string",
          "fieldDescription": "\n\nThe human-readable default value. This will be used if no translation exists.\n\n"
        },
        "i18n": {
          "type": "string",
          "fieldDescription": "\n\nThe localization key for the human-readable value.\n <a href=\"../../internationalization/\">Translations</a> for the keys are defined at the top level of the\n <a href=\"../../add-on-descriptor/\">add-on descriptor</a>.\n\n"
        }
      },
      "required": [
        "value"
      ],
      "shortClassName": "validatorI18nErrorMessage",
      "type": "object",
      "title": "i18n Property",
      "description": "\n\nRepresents a string that can be resolved via a localization properties file. You can use the same `i18n Property` key\n and value in multiple places if you like, but identical keys must have identical values.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"name\": {\n        \"value\": \"My Label\"\n      }\n    }\n\n\n"
    },
    "tabPanel": {
      "properties": {
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "weight": {
          "type": "integer",
          "fieldDescription": "\n\n<p>Determines the order in which the tab panel's link appears in the menu or list.</p>\n\n <p>The \"lightest\" weight (i.e., lowest number) appears first, rising relative to other items,\n while the \"heaviest\" weights sink to the bottom of the menu or list.</p>\n\n <p>Built-in web items have weights that are incremented by numbers that leave room for additional\n items, such as by 10 or 100. Be mindful of the weight you choose for your item, so that it appears\n in a sensible order given existing items.</p>\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "properties": {
                  "condition": {
                    "type": "string",
                    "fieldDescription": "\n\nA string indicating the name of the condition\n\n"
                  },
                  "invert": {
                    "type": "boolean",
                    "fieldDescription": "\n\nA flag indicating whether to invert the boolean result of the condition.\n\n",
                    "defaultValue": "false"
                  },
                  "params": {
                    "additionalProperties": true,
                    "type": "object",
                    "fieldTitle": "Object",
                    "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
                  }
                },
                "required": [
                  "condition"
                ],
                "shortClassName": "singleConditionBean",
                "type": "object",
                "title": "Single Condition",
                "description": "\n\nSingle Conditions are either provided by the host application. See the complete documentation of\n [Conditions](../../conditions/) for more information.\n\n To invert a condition, add the attribute ``invert=\"true\"`` to the condition element.\n This is useful where you want to show the section if a certain condition is not satisfied.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"condition\": \"user_is_logged_in\",\n      \"invert\": false\n    }\n\n\n"
              },
              {
                "properties": {
                  "conditions": {
                    "items": {
                      "type": "object",
                      "anyOf": [
                        {
                          "$ref": "#"
                        },
                        {
                          "$ref": "#/definitions/singleCondition"
                        }
                      ]
                    },
                    "type": "array",
                    "fieldDescription": "\n\nThe conditions to compose using the specific logical operator.\n\n"
                  },
                  "type": {
                    "enum": [
                      "and",
                      "AND",
                      "or",
                      "OR"
                    ],
                    "type": "string",
                    "fieldDescription": "\n\nDefines what logical operator is used to evaluate its collection of condition elements.\n\n"
                  }
                },
                "shortClassName": "compositeConditionBean",
                "type": "object",
                "title": "Composite Condition",
                "description": "\n\nComposite Conditions are composed of a collection of [Single Condition](../single-condition/) / Composite Conditions\n and a type attribute.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"conditions\": [\n        {\n          \"or\": [\n            {\n              \"condition\": \"can_attach_file_to_issue\",\n              \"invert\": false\n            },\n            {\n              \"condition\": \"is_issue_assigned_to_current_user\",\n              \"invert\": false\n            }\n          ]\n        },\n        {\n          \"condition\": \"user_is_logged_in\",\n          \"invert\": false\n        }\n      ]\n    }\n\n\n"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        },
        "url": {
          "format": "uri-template",
          "type": "string",
          "fieldDescription": "\n\nSpecifies the URL targeted by the tab panel. The URL is relative to the add-on's base URL.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "name",
        "url",
        "key"
      ],
      "shortClassName": "connectTabPanelModuleBean",
      "type": "object",
      "title": "Tab Panel",
      "description": "\n\nTab panel modules allow add-ons to insert new elements into the following tabbed sections of the host application's\n user interface.\n\n * Issue page _Activity_ section\n * Project page sidebar\n\nThe tab panel module takes care of integrating the add-on content into the application for you. The add-on content\n automatically gets the tab panel styles and decorators from the host application.\n\n <div class=\"aui-message aui-message-warning\">\n   <p class=\"title\">\n       <strong>`jiraProjectTabPanels` and `jiraProfileTabPanels` are deprecated as of 1 October 2017.</strong>\n   </p>\n   <p>\n    The initial location for `jiraProjectTabPanels` was phased out of Jira Cloud in March 2015.\n    We recommend that apps implement web items and web panels in the [Jira project sidebar](https://developer.atlassian.com/cloud/jira/platform/jira-project-sidebar) instead.\n    Support for `jiraProfileTabPanels` has been removed.\n    If your app has user-specific content, we recommend you create a [general page](https://developer.atlassian.com/cloud/jira/software/modules/page) and a link to this page from the [user profile menu](https://developer.atlassian.com/cloud/jira/platform/user-profile-menu).\n   </p>\n </div>\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraIssueTabPanels\": [\n          {\n            \"url\": \"/my-issue-tab\",\n            \"weight\": 100,\n            \"name\": {\n              \"value\": \"My Issue Tab Panel\"\n            },\n            \"key\": \"my-issue-tab\"\n          }\n        ],\n        \"jiraProjectTabPanels\": [\n          {\n            \"url\": \"/my-project-tab\",\n            \"weight\": 100,\n            \"name\": {\n              \"value\": \"My Project Tab Panel\"\n            },\n            \"key\": \"my-project-tab\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "jiraTimeTrackingProviders": {
      "properties": {
        "adminPageKey": {
          "type": "string",
          "fieldDescription": "\n\nIf provided, this needs to reference an existing `adminPage` module defined by the same add-on.\n Jira will link the referenced `adminPage` module as the configuration page of this time tracking module.\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "name",
        "key"
      ],
      "shortClassName": "timeTrackingProviderBean",
      "type": "object",
      "title": "Time Tracking Provider",
      "description": "\n\nThis module allows an add-on to replace Jira's native time tracking features with\n features provided by the add-on. The purpose of this feature is to allow add-ons that\n provide time tracking functionality to \"hide\" Jira's native features so that users do\n not see duplicate UI elements.\n\n When this module is declared, the name of the module will be displayed as an option \n in Jira's time tracking administration page. When the add-on is selected as the \"Time tracking provider\" for Jira,\n most native Jira time tracking user interface elements will be hidden. However,\n time tracking APIs will remain available.\n\n Specifically, the following native Jira features will be suppressed:\n <ul><li>\"Log work\" button</li>\n <li>Time tracking issue panel</li>\n <li>Work logs issue tab panel</li></ul>\n Add-ons can use standard modules like web items and web panels to implement custom versions of these features.\n \n <h2>Conditions</h2>\n Several time tracking related conditions are provided and intended to be used together with this module. They\n allow you to apply conditions to other modules that you declare, based on whether or not your add-on is selected\n as the current time tracking provider in Jira.\n\n There are three time tracking conditions available:\n <ul><li>`time_tracking_enabled` evaluates to true if time tracking is turned on in Jira with any provider</li>\n <li>`jira_tracking_provider_enabled` condition is true if the currently selected time tracking provider is Jira's native time tracking implementation</li>\n <li>`addon_time_tracking_provider_enabled` condition is true if the currently selected time tracking provider matches the one defined in the condition parameters</li></ul>\n Refer to the [Conditions documentation](../../conditions/#time-tracking-conditions) for information on how to add these conditions to your modules.\n \n <h2>Administration page</h2>\n Your add-on may provide an administration page that will be shown to the user if they select\n your add-on as the time tracking provider.  First declare an [`adminPages` module](../page/), then reference it in the `adminPageKey` field of this module (see below).\n This page will be accessible from the System tab in the Administration page in Jira.\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraTimeTrackingProviders\": [\n          {\n            \"name\": {\n              \"value\": \"My time tracking\"\n            },\n            \"key\": \"my-time-tracking\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "searchRequestView": {
      "properties": {
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "weight": {
          "type": "integer",
          "fieldDescription": "\n\nDetermines the order in which the Search Request View entry appears in the <em>Export</em> menu.\n\n The \"lightest\" weight (i.e., lowest number) appears first, rising relative to other items,\n while the \"heaviest\" weights sink to the bottom of the menu or list.\n\n"
        },
        "description": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA description of your Search Request View\n\n"
        },
        "conditions": {
          "items": {
            "type": "object",
            "anyOf": [
              {
                "$ref": "#/definitions/compositeCondition"
              },
              {
                "$ref": "#/definitions/singleCondition"
              }
            ]
          },
          "type": "array",
          "fieldDescription": "\n\n<a href=\"../../conditions/\">Conditions</a> can be added to display only when all the given conditions are true.\n\n"
        },
        "params": {
          "additionalProperties": true,
          "type": "object",
          "fieldTitle": "Object",
          "fieldDescription": "\n\nThis object represents a map of key/value pairs, where each property name and value corresponds to the parameter name and value respectively.\n\n <b>Example</b>\n\n\n\n\n\n    {\n      \"params\": {\n        \"someOtherProperty\": \"someValue\",\n        \"myCustomProperty\": \"myValue\"\n      }\n    }\n\n\n"
        },
        "url": {
          "type": "string",
          "fieldDescription": "\n\nThe URL of the service that will render the representation for the result set. The URL is\n interpreted relative to the <em>baseUrl</em> in the descriptor.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "name",
        "url",
        "key"
      ],
      "shortClassName": "searchRequestViewModuleBean",
      "type": "object",
      "title": "Search Request View",
      "description": "\n\nA Search Request View allows you to render a custom representation of a search result. Rendering a custom XML format\n is a common example.\n\n After an add-on declaring a Search Request View module is installed, a new entry will show up in the\n <em>Export</em> menu on the Issue Navigator page. Clicking the entry will redirect to the URL that is provided\n by your add-on, passing in the issue keys, pagination information and the signed parameters that allow you\n to verify the validity of the request.\n\n To declare a Search Request View, you must mainly provide the URL that will handle the HTTP GET request.\n This URL is relative to the base url of the descriptor.\n\n Your service will be invoked with these parameters:\n <ul>\n  <li><code>issues</code>: A comma-separated list of issue keys</li>\n  <li><code>link</code>: A link back to the Jira Issue Navigator where the action was invoked</li>\n  <li><code>startIssue</code>: The index of the first passed issue key in the list of all issues</li>\n  <li><code>endIssue</code>: The index of the last passed issue key in the list of all issues</li>\n  <li><code>totalIssues</code>: The number of issues in the entire search result</li>\n </ul>\n\n <h2>Example</h2>\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraSearchRequestViews\": [\n          {\n            \"url\": \"/search-request.csv\",\n            \"weight\": 100,\n            \"description\": {\n              \"value\": \"My search view description\"\n            },\n            \"name\": {\n              \"value\": \"My Search View\"\n            },\n            \"key\": \"my-search-view\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "workflowPostFunction": {
      "properties": {
        "view": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the add-on page that shows the read-only configuration or summary of the workflow post\n function.\n\n The view URL can contain the following context parameters:\n\n - `postFunction.id`: The unique identifier of the post function\n - `postFunction.config`: The configuration value saved to Jira after calling `WorkflowConfiguration.onSave`\n\n"
        },
        "triggered": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the add-on resource that will receive the HTTP POST after a workflow transition. It will also\n include the authentication headers that allow the add-on to validate the authenticity of the request.\n\n <h3>Contents of the HTTP POST</h3>\n\n To understand the type of content that is sent to the add-on after a state transition, you can use the Connect\n inspector tool. The [Connect inspector](http://go.atlassian.com/connect-inspector) is a service that lets you\n generate a temporary Atlassian Connect add-on that you can install in your Cloud development environment to inspect\n the content of event messages.\n\n Here is an example POST body. For brevity, some fields have been removed or truncated.\n\n    {\n        \"configuration\": {\n            \"value\": \"Configuration from the post function edit page\"\n        },\n        \"issue\": {\n            \"fields\": {\n                \"assignee\": { },\n                \"attachment\": [],\n                \"comment\": { },\n                \"components\": [],\n                \"created\": \"2013-11-18T17:56:23.864+1100\",\n                \"description\": null,\n                \"duedate\": null,\n                \"environment\": null,\n                \"fixVersions\": [],\n                \"issuetype\": { },\n                \"labels\": [],\n                \"lastViewed\": \"2013-11-18T17:56:31.793+1100\",\n                \"priority\": { },\n                \"project\": {\n                    \"avatarUrls\": { },\n                    \"id\": \"10000\",\n                    \"key\": \"TEST\",\n                    \"name\": \"Test\"\n                },\n                \"reporter\": { },\n                \"resolution\": { },\n                \"resolutiondate\": \"2013-11-18T17:56:31.799+1100\",\n                \"status\": { },\n                \"summary\": \"The issue summary\",\n                \"updated\": \"2013-11-18T17:56:23.864+1100\",\n                \"versions\": [],\n                \"votes\": { },\n                \"watches\": { },\n                \"workratio\": -1\n            },\n            \"id\": \"10000\",\n            \"key\": \"TEST-1\",\n            \"self\": \"http://issues.example.com/jira/issue/10000\"\n        },\n        \"transition\": {\n            \"from_status\": \"Open\",\n            \"to_status\": \"Resolved\",\n            \"transitionId\": 5,\n            \"transitionName\": \"Resolve Issue\",\n            \"workflowId\": 10000,\n            \"workflowName\": \"classic default workflow\"\n        }\n    }\n\n"
        },
        "edit": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the add-on page that allows to configure the workflow post function once it exists.\n\n The edit URL can contain the following context parameters:\n\n - `postFunction.id`: The unique identifier of the post function\n - `postFunction.config`: The configuration value saved to Jira after calling `WorkflowConfiguration.onSave`\n\n"
        },
        "name": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nA human readable name.\n\n"
        },
        "description": {
          "$ref": "#/definitions/i18nProperty",
          "fieldDescription": "\n\nThe description of the workflow post function. This will be presented to the user when they add a new post\n function to a Jira workflow.\n\n"
        },
        "create": {
          "$ref": "#/definitions/url",
          "fieldDescription": "\n\nThe relative URL to the add-on page that allows to configure the workflow post function on creation.\n\n"
        },
        "key": {
          "pattern": "^[a-zA-Z0-9-]+$",
          "type": "string",
          "fieldDescription": "\n\nA key to identify this module.\n\n This key must be unique relative to the add on, with the exception of Confluence macros: Their keys need to be\n globally unique.\n\n Keys must only contain alphanumeric characters and dashes.\n\n The key is used to generate the url to your add-on's module. The url is generated as a combination of your add-on\n key and module key. For example, an add-on which looks like:\n\n    {\n        \"key\": \"my-addon\",\n        \"modules\": {\n            \"configurePage\": {\n                \"key\": \"configure-me\",\n            }\n        }\n    }\n\n Will have a configuration page module with a URL of `/plugins/servlet/ac/my-addon/configure-me`.\n\n"
        }
      },
      "required": [
        "triggered",
        "name",
        "key"
      ],
      "shortClassName": "workflowPostFunctionModuleBean",
      "type": "object",
      "title": "Workflow Post Function",
      "description": "\n\nPost functions carry out any additional processing required *after* a Jira workflow transition is executed, such as:\n\n * updating an issue's fields\n * adding a comment to an issue\n\nYour add-on needs to declare the URL that Jira will invoke with an HTTP POST after the transition is completed.\n Each POST will include the issue and transition details and the configuration of the workflow function. It\n will also include the authentication headers that allow the add-on to validate the authenticity of that request.\n\nOften, the workflow post function will allow some degree of configuration of its behavior. As an example:\n You may want to react to a state transition only if the issue has a particular label, and you want the project\n administrator to configure that label. For this purpose, three additional URLs in the descriptor\n allow you to declare the pages that will show:\n\n * The form that is shown when a workflow post function is first created\n * The form that is shown when a workflow post function is edited\n * The read-only view or summary of the configuration\n\nAll URLs are relative to the base URL that is declared in the connect-container element of the descriptor.\n\n <h2>Creating and editing a Post Function</h2>\n\nThe create and edit urls will need to present a form with relevant configuration for the post function. In order to\n persist this information with Jira, the page needs to include a snippet of Javascript to facilitate saving this data.\n\n      AP.require([\"jira\"], function(jira) {\n          // When the configuration is saved, this method is called. Return the values for your input elements.\n          jira.WorkflowConfiguration.onSave(function() {\n              var config = {\n                  \"key\": \"val\"\n              };\n              return JSON.stringify(config);\n          });\n\n          // Validate any appropriate input and return true/false\n          jira.WorkflowConfiguration.onSaveValidation(function() {\n              return true;\n          });\n      });\n\n For more information, see the [javascript API](../../jsapi/classes/workflowconfiguration/).\n\n\n <h2>Example</h2>\n\n For a full add-on example, see the [workflow post function example add-on](https://bitbucket.org/atlassianlabs/atlassian-connect-jira-workflow-post-function-example).\n\n\n\n\n\n    {\n      \"modules\": {\n        \"jiraWorkflowPostFunctions\": [\n          {\n            \"description\": {\n              \"value\": \"My Description\"\n            },\n            \"view\": {\n              \"url\": \"/view\"\n            },\n            \"edit\": {\n              \"url\": \"/edit\"\n            },\n            \"create\": {\n              \"url\": \"/create\"\n            },\n            \"triggered\": {\n              \"url\": \"/triggered\"\n            },\n            \"name\": {\n              \"value\": \"My Function\"\n            },\n            \"key\": \"workflow-example\"\n          }\n        ]\n      }\n    }\n\n\n"
    },
    "vendor": {
      "properties": {
        "name": {
          "maxLength": 100,
          "type": "string",
          "fieldDescription": "\n\nThe name of the plugin vendor.\n Supply your name or the name of the company you work for.\n\n"
        },
        "url": {
          "pattern": "^((https|http):\\/\\/.+|[^:]+|)$",
          "maxLength": 200,
          "format": "uri",
          "type": "string",
          "fieldDescription": "\n\nThe url for the vendor's website\n\n"
        }
      },
      "shortClassName": "vendorBean",
      "type": "object",
      "title": "Plugin Vendor",
      "description": "\n\nGives basic information about the plugin vendor.\n\n <h3>Example</h3>\n\n\n\n\n\n    {\n      \"vendor\": {\n        \"name\": \"Atlassian\",\n        \"url\": \"http://www.atlassian.com\"\n      }\n    }\n\n\n"
    }
  }
}