如何基于请求类型控制JSM门户Request View Action的Forge按钮显隐?
解答
关于JSM门户模块的displayConditions
Forge的jiraServiceManagement:portalRequestViewAction模块不支持displayConditions配置,你在manifest里添加的这部分完全不会生效。目前只有Jira核心模块(比如issue面板、issue操作按钮)支持displayConditions,门户类模块暂未开放该能力,官方文档里也没有针对该模块的displayConditions属性列表。
替代实现方案
方案1:前端动态控制显示
直接在UI组件里通过Forge的useProductContext获取当前请求的类型,判断后决定是否渲染按钮,这是最直接轻量的方式。
修改你的src/frontend/index.jsx:
import React from 'react'; import { Button, useProductContext } from '@forge/react'; export default function App() { const context = useProductContext(); // 从上下文获取当前请求的类型名称 const currentRequestType = context?.request?.requestType?.name; // 仅在请求类型为"Bug"时渲染按钮 if (currentRequestType !== 'Bug') { return null; } return <Button onClick={() => {/* 你的按钮点击逻辑 */}}>ShowHide</Button>; }
方案2:后端Resolver校验(可选)
如果需要更严谨的权限控制,可以在Resolver中先查询请求类型,返回是否允许显示的标识,前端再根据结果渲染。
Resolver代码(index.js):
import api from '@forge/api'; export async function handler(event) { const { requestId } = event.context; // 调用JSM API获取请求详情 const res = await api.asUser().requestJira(`/rest/servicedeskapi/request/${requestId}`); const requestData = await res.json(); return { shouldShow: requestData.requestType.name === 'Bug' }; }
前端配合代码:
import React, { useEffect, useState } from 'react'; import { Button, invoke } from '@forge/react'; export default function App() { const [showButton, setShowButton] = useState(false); useEffect(() => { invoke('handler').then(data => setShowButton(data.shouldShow)); }, []); if (!showButton) return null; return <Button onClick={() => {/* 按钮点击逻辑 */}}>ShowHide</Button>; }
注意事项
- 你的manifest中已包含
read:servicedesk-request权限,刚好满足获取请求详情的需求,无需额外添加 - 请求类型名称要和JSM后台配置的完全一致,注意大小写区分
- 优先选择方案1,无需额外API调用,性能更优
内容的提问来源于stack exchange,提问作者Basel
相关产品推荐
相关产品推荐

