refactor(workspace): restore yaml exports and align docker builds

- return scenario export payloads as yaml to match existing workflows

- harden step reordering flow for drag-and-drop and one-based ui labels

- switch server container to workspace-lockfile installs and root ignore rules
This commit is contained in:
2026-04-10 18:19:38 +03:00
parent 259dac806e
commit de0cbeef7c
18 changed files with 361 additions and 11385 deletions
+1 -26
View File
@@ -13,11 +13,9 @@ export function EditStepPage() {
const [scenario, setScenario] = useState<Scenario | null>(null);
const [step, setStep] = useState<ScenarioStep | null>(null);
const [order, setOrder] = useState('');
const [title, setTitle] = useState('');
const [execCode, setExecCode] = useState('');
const [validateCode, setValidateCode] = useState('');
const [orderError, setOrderError] = useState('');
const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false);
const [error, setError] = useState<string | null>(null);
@@ -28,7 +26,6 @@ export function EditStepPage() {
.then(([sc, st]) => {
setScenario(sc);
setStep(st);
setOrder(String(st.order));
setTitle(st.title ?? '');
setExecCode(st.execCode ?? '');
setValidateCode(st.validateCode ?? '');
@@ -37,23 +34,12 @@ export function EditStepPage() {
.finally(() => setLoading(false));
}, [id, stepId]);
const validate = (): boolean => {
let valid = true;
if (isNaN(Number(order)) || Number(order) < 0) {
setOrderError(t('steps.form_order_invalid'));
valid = false;
}
return valid;
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (!validate()) return;
setSaving(true);
setError(null);
try {
await steps.update(id!, stepId!, {
order: Number(order),
title: title.trim() || undefined,
execCode: execCode.trim() || undefined,
validateCode: validateCode.trim() || undefined,
@@ -76,7 +62,7 @@ export function EditStepPage() {
label: scenario?.name ?? `#${id}`,
onClick: () => navigate(`/scenarios/${id}`),
},
{ label: t('steps.edit_title', { order: step?.order ?? stepId }) },
{ label: t('steps.edit_title', { order: step ? step.order + 1 : stepId }) },
]}
/>
</div>
@@ -88,17 +74,6 @@ export function EditStepPage() {
<form onSubmit={handleSubmit} noValidate>
<Card className={styles.formCardFull}>
<div className={styles.formFields}>
<Input
label={t('steps.form_order')}
type="number"
min={0}
value={order}
onChange={(e) => {
setOrder(e.target.value);
setOrderError('');
}}
error={orderError || undefined}
/>
<Input
label={t('steps.form_title')}
placeholder={t('steps.form_title_placeholder')}