Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
989ab0c
🌐 feat: Add Simplified Chinese (zh-Hans) locale
SwakinX Sep 24, 2026
140d079
🌐 feat: Add language setting to settings dialog
SwakinX Sep 24, 2026
119a731
🐛 fix: Localize role and target type dropdown options
SwakinX Sep 24, 2026
51b2838
🌐 feat: TerraVox tool management page (read-only catalog)
SwakinX Sep 24, 2026
cbeded8
✨ feat: TerraVox tool management (CRUD, groups, import)
SwakinX Sep 25, 2026
10f5e3a
feat(tools): import from Gitea with compliance check
SwakinX Sep 25, 2026
3b9ca9b
fix(ui): keep dialogs open on outside click
SwakinX Sep 26, 2026
ce0f5ff
feat(tools): admin-confirmed repo updates panel
SwakinX Sep 28, 2026
389c44a
fix(tools): confirm merge takes pending target version; preserve fiel…
SwakinX Sep 28, 2026
cf9fe41
test(tools): version mismatch now blocks confirm (gateway escalates t…
SwakinX Sep 28, 2026
49919ec
feat(usage): tool run reports page with filters and CSV export
SwakinX Sep 28, 2026
db4ab1f
fix(usage): tool catalog query passed as call — page crashed at render
SwakinX Sep 28, 2026
6be16fa
feat(tools): register web-link and extension-plugin tools (2.11.0)
SwakinX Sep 28, 2026
4b1b45e
fix(usage): tolerate null username in gateway run reports (stats page…
SwakinX Sep 29, 2026
a057bba
feat(services): service registry page (bind map/datasource, probe, gr…
SwakinX Sep 29, 2026
95731b7
build: retry bun install in-image (proxy line randomly truncates tarb…
SwakinX Sep 29, 2026
156054f
tools admin: usage tab folded into tool management (refresh button ad…
SwakinX Sep 29, 2026
11a1bdb
tools: per-tool allowed-groups editor removed (visibility now governe…
SwakinX Sep 29, 2026
6493d0c
tools admin: inline group cell becomes an input+datalist (same contro…
SwakinX Sep 30, 2026
634838a
usage: prefer the display name (user_name) in the user column and CSV…
SwakinX Sep 30, 2026
94027a3
services admin: set/unset the map-browser basemap from the row menu w…
SwakinX Sep 30, 2026
e1a1753
services admin: discover dialog (base URL -> checkable REST map/data …
SwakinX Sep 30, 2026
4ce9750
tools/services admin: inline row actions (no more kebab menus); usage…
SwakinX Sep 30, 2026
bea0919
feat(services,tools): 服务管理页拆 服务绑定/底图管理 两标签;绑定编辑移除底图区
SwakinX Sep 30, 2026
d9e251c
fix(services): 探测对话框搜索过滤后只绑定可见项(所见即所绑)
SwakinX Sep 30, 2026
59640f0
feat(basemaps): 选择区改双列表——左服务可搜索、右地图可搜索多选(对齐前端添加图层弹窗)
SwakinX Oct 4, 2026
961ef6e
style(basemaps): 保存按钮移至右侧并改主色轮廓样式
SwakinX Oct 4, 2026
381a3d0
feat(tools): 分组下拉改配置页同款标准下拉(click-ui Select)——替换 datalist 割裂样式
SwakinX Oct 4, 2026
8a1c41a
feat(tools): 参数与表单改交互式参数构建器——可视化/JSON 双向绑定
SwakinX Oct 4, 2026
3ce29da
fix(tools): 添加参数下拉 portal 到 body + fixed 定位——弹窗内 absolute 被裁剪(实测)
SwakinX Oct 4, 2026
9e967d4
fix(tools): 添加参数下拉 portal 进弹窗容器——body 无主题变量致透明且被遮罩挡住
SwakinX Oct 4, 2026
e7a938c
fix(tools): 添加参数下拉 portal 目标改为锚点所属弹窗——首个 [role=dialog] 可能是隐藏空壳
SwakinX Oct 4, 2026
f7c5673
fix(tools): 添加参数菜单底色/文字取弹窗计算值——cui 变量运行时为空致透明;hover 改主题无关叠加
SwakinX Oct 4, 2026
6128c75
fix(tools): 添加参数菜单坐标改按弹窗包含块计算并内部滚动——弹窗 transform 使 fixed 相对弹窗、overflo…
SwakinX Oct 4, 2026
572739e
style(tools): 编辑弹窗内容区最小高度 55vh(最大 65vh)——参数构建器等矮内容页不再局促
SwakinX Oct 4, 2026
6d4ca50
feat(tools): 添加参数改标准下拉(click-ui Select)——替换自定义 portal 菜单
SwakinX Oct 4, 2026
56c77bc
fix(tools): 添加参数恢复第一版点击交互——按钮+portal菜单点选项即添加
SwakinX Oct 4, 2026
abd1bf2
fix(tools): 补回误删的 addOpen/addPos/addColors 状态——参数tab整页崩溃(ReferenceError)
SwakinX Oct 4, 2026
ca47264
style(tools): 添加参数 Button 改 label prop(click-ui lint 规则)
SwakinX Oct 4, 2026
5c35bcd
fix(tools): param-add 锚点挪到 Button 外层——click-ui Button 带 label 时忽略 chi…
SwakinX Oct 4, 2026
1114718
fix(tools): 补回误删的 Select 导入——类型下拉在展开卡片渲染时 ReferenceError 致整页崩
SwakinX Oct 4, 2026
3948f36
feat(tools): 添加参数改 click-ui Dropdown(Radix)——自动定位/portal,根治裁剪与透明
SwakinX Oct 5, 2026
cd7bff2
fix(tools): 移除 addParam 内残留的 setAddOpen(状态已删,点选项即 ReferenceError 致无法添…
SwakinX Oct 5, 2026
16eeace
style(tools): 编辑弹窗最小高度 55vh -> 35vh(用户调整)
SwakinX Oct 5, 2026
1ce0fef
fix(tools): 参数添加菜单补显式 hover 高亮——弹窗焦点陷阱致 data-highlighted 不生效
SwakinX Oct 5, 2026
782e231
fix(tools): Dropdown.Content 补 param-add-menu 类——hover 规则选择器匹配不到
SwakinX Oct 5, 2026
ed532ee
feat(services): 服务绑定列表按类型筛选——全部/地图服务/数据服务 chips 带计数
SwakinX Oct 5, 2026
5913dd4
fix(services): 编辑绑定类型切换即覆盖清空异型字段——默认类型改地图服务
SwakinX Oct 5, 2026
ef9a4c2
style(services): 服务管理 tab 栏与搜索框对齐设置页标准组件
SwakinX Oct 5, 2026
8069994
style(services): 合并底图管理重复的 shared 导入
SwakinX Oct 5, 2026
207723d
style(services): 服务管理页边距对齐工具管理页标准布局(px-4 pt-2 页面容器 + tab 下 pt-4 内容区)
SwakinX Oct 5, 2026
dce386c
refactor(admin): 服务/工具管理 UI 统一标准组件并清理冗余
SwakinX Oct 5, 2026
4b90bda
test(tools): click-ui mock 补 Checkbox 桩——暴露面换装后 ToolRow 渲染不再崩溃
SwakinX Oct 5, 2026
dd08ce3
fix(params): ParamBuilder 序列化对齐 manifest v1——choices_from/accept 按契约形态读写
SwakinX Oct 5, 2026
f928e10
refactor(types): TerraVox 领域类型迁入 src/types/terravox.ts(CLAUDE.md:164)
SwakinX Oct 5, 2026
150e592
fix(tools): 工具编辑弹窗 SelectField 定宽——工具 id 前缀分组下拉不再收缩截断
SwakinX Oct 6, 2026
d94bfa4
feat(tools): 分组拖拽排序 + 组内工具拖拽排序(2.22.0,display_order)
SwakinX Oct 6, 2026
b055b41
feat(tools): 分组工具详情弹窗——组内工具直接添加/移除/拖拽排序(2.22.0)
SwakinX Oct 6, 2026
29a7d48
refactor(tools): 拖拽全面换装 dnd-kit——分组详情改双列表并排拖拽
SwakinX Oct 6, 2026
3160290
chore: 移除误入库的临时补丁脚本
SwakinX Oct 6, 2026
f51e53f
fix(tools): /tools 路由崩溃——KeyboardSensor 误用 useSensor() 包裹导致 DndContex…
SwakinX Oct 6, 2026
e4c05f5
fix(tools): 分组详情双列表无限 setState 循环——toolsQuery 加载期空数组身份不稳致同步 effect 每轮…
SwakinX Oct 6, 2026
18c5958
fix(tools): 清单行/详情右列拖拽锁定竖直轴——横向位移不再触发重排(2.22.0 用户反馈)
SwakinX Oct 6, 2026
333a9e2
fix(tools): modifiers 真正接入 DndContext——上次提交只声明未接线(grep 断言补验)
SwakinX Oct 6, 2026
9c3358e
fix(tools): ToolGroupsTab 补回 restrictToVerticalAxis 导入——上次接线后 import …
SwakinX Oct 6, 2026
268ec15
fix(tools): 分组详情双列表恢复自由二维拖动——restrictToVerticalAxis 锁死跨列
SwakinX Oct 6, 2026
96ea48b
fix(tools): 修正 JSX 注释语法(&& 分组内不能用 {/* */} 表达式容器)
SwakinX Oct 6, 2026
50cedfc
使用统计页加「来源」列(contracts 2.24.0):AI 调用/手动执行/浏览器直跑映射
SwakinX Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,6 @@ playwright-report/
blob-report/
playwright/.cache/
playwright/.auth/

# tsc incremental build artifact
tsconfig.tsbuildinfo
7 changes: 4 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ WORKDIR /app

# --- Install ---
FROM base AS deps
ENV BUN_CONFIG_MAX_HTTP_REQUESTS=12
COPY package.json bun.lock .npmrc ./
COPY patches/ patches/
COPY tools/ tools/
RUN bun install --frozen-lockfile
RUN ok=0; for i in $(seq 1 12); do bun install --frozen-lockfile && ok=1 && break; echo "network retry $i"; done; [ "$ok" = 1 ]

# --- Build ---
FROM base AS build
Expand All @@ -20,11 +21,11 @@ RUN bun run build

# --- Production dependencies (patches applied, then devDeps stripped) ---
FROM base AS prod-deps
ENV BUN_CONFIG_MAX_HTTP_REQUESTS=12
COPY package.json bun.lock .npmrc ./
COPY patches/ patches/
COPY tools/ tools/
RUN bun install --frozen-lockfile \
&& bun install --frozen-lockfile --production
RUN ok=0; for i in $(seq 1 12); do bun install --frozen-lockfile && bun install --frozen-lockfile --production && ok=1 && break; echo "network retry $i"; done; [ "$ok" = 1 ]

# --- Runtime ---
FROM base AS runtime
Expand Down
14 changes: 14 additions & 0 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
},
"dependencies": {
"@clickhouse/click-ui": "0.9.1",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/modifiers": "9.0.0",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@librechat/data-schemas": "^0.0.56",
"@radix-ui/react-dialog": "1.1.15",
"@tailwindcss/vite": "^4.3.1",
Expand Down
41 changes: 40 additions & 1 deletion src/components/SettingsDialog.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Dialog } from '@clickhouse/click-ui';
import { Dialog, Select } from '@clickhouse/click-ui';
import { useTranslation } from 'react-i18next';
import type * as t from '@/types';
import { useTheme } from '@/contexts/ThemeContext';
import { useLocalize } from '@/hooks';
Expand All @@ -11,9 +12,26 @@ const THEME_LABEL_KEYS: Record<t.ThemeOption, string> = {
dark: 'com_nav_theme_dark',
};

const LANGUAGE_OPTIONS = ['en', 'zh-Hans'] as const;
type LanguageOption = (typeof LANGUAGE_OPTIONS)[number];
const LANGUAGE_LABEL_KEYS: Record<LanguageOption, string> = {
en: 'com_ui_language_english',
'zh-Hans': 'com_ui_language_zh_hans',
};

export function SettingsDialog({ open, onClose }: t.SettingsDialogProps) {
const localize = useLocalize();
const { theme, setTheme } = useTheme();
const { i18n } = useTranslation();

const resolvedLanguage = i18n.resolvedLanguage ?? i18n.language ?? 'en';
const currentLanguage: LanguageOption = resolvedLanguage.startsWith('zh') ? 'zh-Hans' : 'en';

const setLanguage = (language: LanguageOption) => {
i18n.changeLanguage(language);
localStorage.setItem('i18nextLng', language);
document.documentElement.lang = language;
};

return (
<Dialog
Expand All @@ -23,6 +41,7 @@ export function SettingsDialog({ open, onClose }: t.SettingsDialogProps) {
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_ui_settings')}
showClose
onClose={onClose}
Expand Down Expand Up @@ -57,6 +76,26 @@ export function SettingsDialog({ open, onClose }: t.SettingsDialogProps) {
))}
</div>
</div>
<div className="flex items-center justify-between">
<div className="flex flex-col gap-0.5">
<span className="text-sm font-medium text-(--cui-color-text-default)">
{localize('com_ui_language')}
</span>
</div>
<div className="w-40 shrink-0">
<Select
value={currentLanguage}
onSelect={(v) => setLanguage(v as LanguageOption)}
aria-label={localize('com_ui_language')}
>
{LANGUAGE_OPTIONS.map((opt) => (
<Select.Item key={opt} value={opt}>
{localize(LANGUAGE_LABEL_KEYS[opt])}
</Select.Item>
))}
</Select>
</div>
</div>
</div>
</Dialog.Content>
</Dialog>
Expand Down
3 changes: 3 additions & 0 deletions src/components/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ const navItems: t.NavItem[] = [
capability: [SystemCapabilities.READ_ROLES, SystemCapabilities.READ_GROUPS],
},
{ labelKey: 'com_nav_grants', path: '/grants', icon: 'lock' },
{ labelKey: 'com_nav_tools', path: '/tools', icon: 'plug' },
// 使用统计并入 /tools?tab=usage(2.16.0),侧栏不再单列
{ labelKey: 'com_nav_services', path: '/services', icon: 'server' },
{ labelKey: 'com_nav_help', path: '/help', icon: 'question' },
];

Expand Down
1 change: 1 addition & 0 deletions src/components/access/CreateGroupDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ export function CreateGroupDialog({ open, onClose }: t.CreateGroupDialogProps) {
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_access_create_group')}
showClose
onClose={resetAndClose}
Expand Down
1 change: 1 addition & 0 deletions src/components/access/CreateRoleDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export function CreateRoleDialog({ open, onClose }: t.CreateRoleDialogProps) {
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_access_create_role')}
showClose
onClose={resetAndClose}
Expand Down
1 change: 1 addition & 0 deletions src/components/access/EditGroupDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ export function EditGroupDialog({ group, canManage, onClose }: t.EditGroupDialog
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_access_edit_group')}
showClose
onClose={onClose}
Expand Down
1 change: 1 addition & 0 deletions src/components/access/EditRoleDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ export function EditRoleDialog({ role, canManage, onClose }: t.EditRoleDialogPro
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_access_edit_role')}
showClose
onClose={onClose}
Expand Down
1 change: 1 addition & 0 deletions src/components/configuration/ConfirmSaveDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export function ConfirmSaveDialog({
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_config_confirm_save_title')}
showClose
onClose={onCancel}
Expand Down
1 change: 1 addition & 0 deletions src/components/configuration/DeleteProfileValueModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export function DeleteProfileValueModal({
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_scope_confirm_remove')}
showClose
onClose={onCancel}
Expand Down
1 change: 1 addition & 0 deletions src/components/configuration/ImportYamlDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ export function ImportYamlDialog({
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_config_import_yaml_title')}
showClose
onClose={handleClose}
Expand Down
1 change: 1 addition & 0 deletions src/components/configuration/ProfileIndicator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ export function ProfileIndicator({
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_scope_cascade_title')}
showClose
onClose={handleClose}
Expand Down
3 changes: 2 additions & 1 deletion src/components/configuration/ProfileValueModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ export function ProfileValueModal({
if (!isOpen) onCancel();
}}
>
<Dialog.Content title={title} showClose onClose={onCancel} className="modal-frost">
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()} title={title} showClose onClose={onCancel} className="modal-frost">
<div className="flex flex-col gap-4">
<div className="flex items-center gap-2">
{scopeConfig && (
Expand Down
1 change: 1 addition & 0 deletions src/components/configuration/ResetBaseConfigDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export function ResetBaseConfigDialog({
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={localize('com_config_reset_base_title')}
showClose
onClose={onCancel}
Expand Down
12 changes: 12 additions & 0 deletions src/components/dashboard/DashboardPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,18 @@ const QUICK_LINKS: (t.NavItem & { descKey: string })[] = [
icon: 'lock',
descKey: 'com_dash_grants_desc',
},
{
labelKey: 'com_nav_tools',
path: '/tools',
icon: 'plug',
descKey: 'com_dash_tools_desc',
},
{
labelKey: 'com_nav_services',
path: '/services',
icon: 'server',
descKey: 'com_dash_services_desc',
},
{
labelKey: 'com_nav_help',
path: '/help',
Expand Down
4 changes: 4 additions & 0 deletions src/components/grants/AuditLogDetailDrawer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ export function AuditLogDetailDrawer({
)}
/>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
aria-label={localize('com_audit_detail_title')}
onEscapeKeyDown={() => onClose()}
className={cn(
Expand Down Expand Up @@ -270,6 +271,7 @@ export function AuditLogDetailDrawer({
)}
/>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
aria-label={localize('com_audit_detail_title')}
onEscapeKeyDown={() => onClose()}
className={cn(
Expand Down Expand Up @@ -322,6 +324,7 @@ export function AuditLogDetailDrawer({
)}
/>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
aria-label={localize('com_audit_detail_title')}
onEscapeKeyDown={() => onClose()}
className={cn(
Expand Down Expand Up @@ -387,6 +390,7 @@ export function AuditLogDetailDrawer({
)}
/>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
aria-label={localize('com_audit_detail_title')}
onEscapeKeyDown={() => onClose()}
className={cn(
Expand Down
53 changes: 8 additions & 45 deletions src/components/grants/AuditLogTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
exportAuditLogServerFn,
} from '@/server';
import {
DatePickerCell,
EmptyState,
LoadingState,
Pagination,
Expand All @@ -36,58 +37,20 @@ import { AuditLogDetailDrawer } from './AuditLogDetailDrawer';
import { cn } from '@/utils';

const AUDIT_ACTIONS: readonly AuditAction[] = ['grant.assigned', 'grant.removed'] as const;
const TARGET_TYPE_OPTIONS: readonly PrincipalType[] = [
const TARGET_TYPE_OPTIONS = [
PrincipalType.USER,
PrincipalType.GROUP,
PrincipalType.ROLE,
] as const;
const TARGET_TYPE_LABEL_KEYS: Record<(typeof TARGET_TYPE_OPTIONS)[number], string> = {
[PrincipalType.USER]: 'com_audit_target_user',
[PrincipalType.GROUP]: 'com_audit_target_group',
[PrincipalType.ROLE]: 'com_audit_target_role',
};
/** Radix `Select.Item` cannot use `value=""` (Radix reserves empty string for
* "no selection"). Use a non-empty sentinel and translate to `''` in state. */
const TARGET_TYPE_ALL = '__all__';

/**
* Wraps a click-ui DatePicker so only the trigger button is tab-focusable.
* click-ui renders both a PopoverTrigger button AND an inner readonly input,
* which produces two stops in the tab order. The input has no exposed `tabIndex`
* prop, so we reach for the DOM node and set it to -1. The class hooks the
* CSS rule that rounds the trigger's focus outline to match the wrapper border.
*
* `resetKey` is the caller's signal that the inner DatePicker has been keyed
* to remount (e.g. the Clear button bumping a nonce): the inner `<input>` is
* replaced and the previous patch is lost, so the effect must re-run and
* re-apply `tabIndex = -1` against the fresh DOM node.
*/
function DatePickerCell({
children,
resetKey,
inputId,
}: {
children: React.ReactNode;
resetKey?: unknown;
/**
* Stamps the click-ui-rendered `<input>` with an `id` so an external
* `<label htmlFor={...}>` (and the e2e WCAG check) can target it. click-ui
* has no `id` prop, so we apply it via DOM ref in the same effect that
* removes the input from the tab order.
*/
inputId?: string;
}) {
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
const node = ref.current;
if (!node) return;
const input = node.querySelector('input');
if (!input) return;
input.tabIndex = -1;
if (inputId) input.id = inputId;
}, [resetKey, inputId]);
return (
<div ref={ref} className="audit-date-cell contents">
{children}
</div>
);
}

function downloadBlob(blob: Blob): void {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
Expand Down Expand Up @@ -510,7 +473,7 @@ export function AuditLogTab() {
<Select.Item value={TARGET_TYPE_ALL}>{localize('com_ui_all')}</Select.Item>
{TARGET_TYPE_OPTIONS.map((pt) => (
<Select.Item key={pt} value={pt}>
{pt}
{localize(TARGET_TYPE_LABEL_KEYS[pt])}
</Select.Item>
))}
</Select>
Expand Down
1 change: 1 addition & 0 deletions src/components/grants/EditCapabilitiesDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ export function EditCapabilitiesDialog({
}}
>
<Dialog.Content
onInteractOutside={(event) => event.preventDefault()}
title={dialogTitle}
showClose
onClose={onClose}
Expand Down
Loading