import { useMemo, useState } from 'react'; import { Plus, Save, Trash2, X } from 'lucide-react'; import { DrawerShell } from '../../../components/DrawerShell'; import { PasswordInput } from '../../../components/PasswordInput'; import { LucentIconButton } from '../../../components/lucent/LucentIconButton'; import './DashboardManagementModals.css'; import './DashboardSupportModals.css'; interface CommonModalLabels { cancel: string; close: string; save: string; } interface EnvParamsModalLabels extends CommonModalLabels { addEnvParam: string; envDraftPlaceholderKey: string; envDraftPlaceholderValue: string; envParams: string; envParamsDesc: string; envParamsHint: string; envValue: string; hideEnvValue: string; noEnvParams: string; removeEnvParam: string; showEnvValue: string; } interface EnvParamsModalProps { open: boolean; envEntries: Array<[string, string]>; envDraftKey: string; envDraftValue: string; labels: EnvParamsModalLabels; onClose: () => void; onCreateEnvParam: (key: string, value: string) => Promise | boolean; onDeleteEnvParam: (key: string) => Promise | boolean; onEnvDraftKeyChange: (value: string) => void; onEnvDraftValueChange: (value: string) => void; onSaveEnvParam: (originalKey: string, nextKey: string, nextValue: string) => Promise | boolean; } export function EnvParamsModal({ open, envEntries, envDraftKey, envDraftValue, labels, onClose, onCreateEnvParam, onDeleteEnvParam, onEnvDraftKeyChange, onEnvDraftValueChange, onSaveEnvParam, }: EnvParamsModalProps) { const [createPanelOpen, setCreatePanelOpen] = useState(false); const [envEditDrafts, setEnvEditDrafts] = useState>({}); const resetLocalState = () => { setCreatePanelOpen(false); setEnvEditDrafts({}); }; const mergedEnvDrafts = useMemo(() => { const nextDrafts: Record = {}; envEntries.forEach(([key, value]) => { nextDrafts[key] = envEditDrafts[key] || { key, value }; }); return nextDrafts; }, [envEditDrafts, envEntries]); if (!open) return null; return ( { resetLocalState(); onClose(); }} title={labels.envParams} size="standard" bodyClassName="ops-config-drawer-body" closeLabel={labels.close} footer={( !createPanelOpen ? (
{labels.envParamsHint}
) : undefined )} >
{envEntries.length === 0 ? (
{labels.noEnvParams}
) : ( envEntries.map(([key, value]) => { const draft = mergedEnvDrafts[key] || { key, value }; return (
{draft.key || key}
{labels.envValue}
{ const deleted = await onDeleteEnvParam(key); if (!deleted) return; setEnvEditDrafts((prev) => { if (!(key in prev)) return prev; const next = { ...prev }; delete next[key]; return next; }); }} tooltip={labels.removeEnvParam} aria-label={labels.removeEnvParam} >
{ const nextKey = e.target.value.toUpperCase(); setEnvEditDrafts((prev) => ({ ...prev, [key]: { ...(prev[key] || { key, value }), key: nextKey, }, })); }} placeholder={labels.envDraftPlaceholderKey} autoComplete="off" />
{ const nextValue = e.target.value; setEnvEditDrafts((prev) => ({ ...prev, [key]: { ...(prev[key] || { key, value }), value: nextValue, }, })); }} placeholder={labels.envValue} autoComplete="off" wrapperClassName="is-inline" toggleLabels={{ show: labels.showEnvValue, hide: labels.hideEnvValue, }} />
{labels.envParamsHint}
); }) )}
{createPanelOpen ? (
{labels.addEnvParam}
{labels.envParamsHint}
{ resetLocalState(); onEnvDraftKeyChange(''); onEnvDraftValueChange(''); }} tooltip={labels.cancel} aria-label={labels.cancel} >
onEnvDraftKeyChange(e.target.value.toUpperCase())} placeholder={labels.envDraftPlaceholderKey} autoComplete="off" />
onEnvDraftValueChange(e.target.value)} placeholder={labels.envDraftPlaceholderValue} autoComplete="off" wrapperClassName="is-inline" toggleLabels={{ show: labels.showEnvValue, hide: labels.hideEnvValue, }} />
{labels.envParamsHint}
) : null}
); }