You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于请求类型控制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:55:07