fix: removed legacy code

This commit is contained in:
Ida 2026-05-13 15:03:37 +02:00
parent 4bf6677bc5
commit c13489e232
2 changed files with 112 additions and 114 deletions

View file

@ -256,11 +256,6 @@
background: var(--bg-primary, #fff); background: var(--bg-primary, #fff);
} }
/* Single toolbar row (all controls in one flex wrap). */
.canvasHeaderRow {
width: 100%;
}
.canvasHeaderToolbar { .canvasHeaderToolbar {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
@ -295,48 +290,6 @@
color: var(--text-primary, #333); color: var(--text-primary, #333);
} }
.canvasHeaderTitleBlock {
flex: 1 1 auto;
min-width: 0;
display: flex;
align-items: center;
gap: 0.25rem;
}
.canvasHeaderTitle,
.canvasHeaderTitle input {
margin: 0;
min-width: 0;
font-size: 0.95rem;
font-weight: 600;
color: var(--text-primary, #1a1a1a);
}
.canvasHeaderTitle {
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.canvasHeaderTitleMuted {
font-style: italic;
font-weight: 500;
opacity: 0.65;
color: var(--text-secondary, #666);
}
.canvasHeaderTitle input {
width: 100%;
max-width: 100%;
padding: 0.25rem 0.4rem;
border: 1px solid var(--primary-color, #007bff);
border-radius: 4px;
outline: none;
background: var(--bg-primary, #fff);
box-sizing: border-box;
}
.canvasHeaderIconBtn { .canvasHeaderIconBtn {
padding: 6px !important; padding: 6px !important;
min-width: 30px !important; min-width: 30px !important;
@ -375,7 +328,7 @@
width: 100%; width: 100%;
} }
.canvasHeaderVersionRow button { .canvasHeaderVersionRow :global(.button) {
margin-top: 0; margin-top: 0;
} }
@ -386,6 +339,57 @@
flex: 0 0 auto; flex: 0 0 auto;
} }
.canvasHeaderVersionBadge {
padding: 2px 8px;
border-radius: 10px;
font-size: 0.75rem;
font-weight: 600;
background: var(--canvasHeaderBadgeBg, transparent);
color: var(--canvasHeaderBadgeFg, inherit);
flex: 0 0 auto;
}
.canvasHeaderVersionAction {
font-size: 0.8rem !important;
padding: 0.25rem 0.6rem !important;
min-height: auto !important;
}
.canvasHeaderVersionSpinner {
font-size: 0.85rem;
}
.canvasHeaderExecuteBanner {
margin-top: 0.5rem;
padding: 0.5rem;
border-radius: 6px;
font-size: 0.875rem;
}
.canvasHeaderExecuteBannerSuccess {
background: rgba(40, 167, 69, 0.15);
color: var(--success-color, #28a745);
}
.canvasHeaderExecuteBannerWarning {
background: rgba(255, 193, 7, 0.15);
color: var(--warning-color, #ffc107);
}
.canvasHeaderExecuteBannerPaused {
background: rgba(0, 123, 255, 0.15);
color: var(--primary-color, #007bff);
}
.canvasHeaderExecuteBannerError {
background: rgba(220, 53, 69, 0.15);
color: var(--danger-color, #dc3545);
}
.canvasHeaderSysadminInput {
margin: 0;
}
.canvasHeaderVersionSelect { .canvasHeaderVersionSelect {
width: 11rem; width: 11rem;
max-width: 100%; max-width: 100%;

View file

@ -35,9 +35,9 @@ interface CanvasHeaderProps {
saving: boolean; saving: boolean;
executing: boolean; executing: boolean;
hasNodes: boolean; hasNodes: boolean;
/** Phase-4 Schicht-4: when set, the Run button is disabled and the message /** When set, required-field graph errors block a normal run; message is the
* is shown as a tooltip. Click triggers `onExecuteBlockedClick` so the * run button tooltip. Click still fires `onExecuteBlockedClick` to focus
* parent can navigate the user to the first offending node. */ * the first offending node. */
executeBlockedReason?: string | null; executeBlockedReason?: string | null;
onExecuteBlockedClick?: () => void; onExecuteBlockedClick?: () => void;
executeResult: ExecuteGraphResponse | null; executeResult: ExecuteGraphResponse | null;
@ -138,9 +138,18 @@ export const CanvasHeader: React.FC<CanvasHeaderProps> = ({
: t('Ausführen'); : t('Ausführen');
const _runTitle = executeBlockedReason ?? (hasNodes ? t('Ausführen') : t('Keine Nodes zum Ausführen.')); const _runTitle = executeBlockedReason ?? (hasNodes ? t('Ausführen') : t('Keine Nodes zum Ausführen.'));
const _executeBannerSegmentClass = !executeResult
? ''
: executeResult.success
? executeResult.warning
? styles.canvasHeaderExecuteBannerWarning
: styles.canvasHeaderExecuteBannerSuccess
: executeResult.paused
? styles.canvasHeaderExecuteBannerPaused
: styles.canvasHeaderExecuteBannerError;
return ( return (
<div className={styles.canvasHeader}> <div className={styles.canvasHeader}>
<div className={styles.canvasHeaderRow}>
<div <div
className={styles.canvasHeaderToolbar} className={styles.canvasHeaderToolbar}
role="toolbar" role="toolbar"
@ -295,13 +304,12 @@ export const CanvasHeader: React.FC<CanvasHeaderProps> = ({
type="checkbox" type="checkbox"
checked={!!verboseSchema} checked={!!verboseSchema}
onChange={(e) => onVerboseSchemaChange(e.target.checked)} onChange={(e) => onVerboseSchemaChange(e.target.checked)}
style={{ margin: 0 }} className={styles.canvasHeaderSysadminInput}
/> />
{t('Schema-Details')} {t('Schema-Details')}
</label> </label>
)} )}
</div> </div>
</div>
{currentWorkflowId && versions && versions.length > 0 && ( {currentWorkflowId && versions && versions.length > 0 && (
<div className={styles.canvasHeaderVersionRow}> <div className={styles.canvasHeaderVersionRow}>
@ -321,108 +329,94 @@ export const CanvasHeader: React.FC<CanvasHeaderProps> = ({
))} ))}
</select> </select>
<span <span
style={{ className={styles.canvasHeaderVersionBadge}
padding: '2px 8px', style={
borderRadius: 10, {
fontSize: '0.75rem', '--canvasHeaderBadgeBg': `${badge.color}22`,
fontWeight: 600, '--canvasHeaderBadgeFg': badge.color,
background: badge.color + '22', } as React.CSSProperties
color: badge.color, }
}}
> >
{badge.label} {badge.label}
</span> </span>
{currentVersion && currentStatus === 'draft' && onPublishVersion && ( {currentVersion && currentStatus === 'draft' && onPublishVersion && (
<button <Button
type="button" type="button"
className={styles.retryButton} variant={_tb}
size={_ts}
icon={FaCloudUploadAlt}
className={styles.canvasHeaderVersionAction}
onClick={() => onPublishVersion(currentVersion.id)} onClick={() => onPublishVersion(currentVersion.id)}
disabled={versionLoading} disabled={versionLoading}
title={t('Version veröffentlichen')} title={t('Version veröffentlichen')}
style={{ fontSize: '0.8rem', padding: '0.25rem 0.6rem' }}
> >
<FaCloudUploadAlt style={{ marginRight: 4 }} />
{t('Veröffentlichen')} {t('Veröffentlichen')}
</button> </Button>
)} )}
{currentVersion && currentStatus === 'published' && onUnpublishVersion && ( {currentVersion && currentStatus === 'published' && onUnpublishVersion && (
<button <Button
type="button" type="button"
className={styles.retryButton} variant={_tb}
size={_ts}
icon={FaCloudDownloadAlt}
className={styles.canvasHeaderVersionAction}
onClick={() => onUnpublishVersion(currentVersion.id)} onClick={() => onUnpublishVersion(currentVersion.id)}
disabled={versionLoading} disabled={versionLoading}
title={t('Veröffentlichung zurücknehmen')} title={t('Veröffentlichung zurücknehmen')}
style={{ fontSize: '0.8rem', padding: '0.25rem 0.6rem' }}
> >
<FaCloudDownloadAlt style={{ marginRight: 4 }} />
{t('Veröffentlichung aufheben')} {t('Veröffentlichung aufheben')}
</button> </Button>
)} )}
{currentVersion && currentStatus !== 'archived' && onArchiveVersion && ( {currentVersion && currentStatus !== 'archived' && onArchiveVersion && (
<button <Button
type="button" type="button"
className={styles.retryButton} variant={_tb}
size={_ts}
icon={FaArchive}
className={styles.canvasHeaderVersionAction}
onClick={() => onArchiveVersion(currentVersion.id)} onClick={() => onArchiveVersion(currentVersion.id)}
disabled={versionLoading} disabled={versionLoading}
title={t('Version archivieren')} title={t('Version archivieren')}
style={{ fontSize: '0.8rem', padding: '0.25rem 0.6rem' }}
> >
<FaArchive style={{ marginRight: 4 }} /> {t('Archiv')}
Archiv </Button>
</button>
)} )}
{onCreateDraft && ( {onCreateDraft && (
<button <Button
type="button" type="button"
className={styles.retryButton} variant={_tb}
size={_ts}
icon={FaPlus}
className={styles.canvasHeaderVersionAction}
onClick={onCreateDraft} onClick={onCreateDraft}
disabled={versionLoading} disabled={versionLoading}
title={t('Neuen Entwurf erstellen')} title={t('Neuen Entwurf erstellen')}
style={{ fontSize: '0.8rem', padding: '0.25rem 0.6rem' }}
> >
+ Entwurf {t('+ Entwurf')}
</button> </Button>
)} )}
{versionLoading && <FaSpinner className={styles.spinner} style={{ fontSize: '0.85rem' }} />} {versionLoading && <FaSpinner className={`${styles.spinner} ${styles.canvasHeaderVersionSpinner}`} />}
</div> </div>
)} )}
{executeResult && ( {executeResult && (
<div <div
style={{ className={`${styles.canvasHeaderExecuteBanner} ${_executeBannerSegmentClass}`}
marginTop: '0.5rem',
padding: '0.5rem',
borderRadius: 6,
fontSize: '0.875rem',
background: executeResult.success
? executeResult.warning
? 'rgba(255,193,7,0.15)'
: 'rgba(40,167,69,0.15)'
: (executeResult as { paused?: boolean }).paused
? 'rgba(0,123,255,0.15)'
: 'rgba(220,53,69,0.15)',
color: executeResult.success
? executeResult.warning
? 'var(--warning-color,#ffc107)'
: 'var(--success-color,#28a745)'
: (executeResult as { paused?: boolean }).paused
? 'var(--primary-color,#007bff)'
: 'var(--danger-color,#dc3545)',
}}
> >
{executeResult.success ? ( {executeResult.success ? (
executeResult.warning ? ( executeResult.warning ? (
<> {executeResult.warning}</> <>{executeResult.warning}</>
) : ( ) : (
<>{t('Ausführung abgeschlossen')}</> <>{t('Ausführung abgeschlossen')}</>
) )
) : (executeResult as { paused?: boolean }).paused ? ( ) : executeResult.paused ? (
<> <>
Workflow pausiert. Öffne <strong>{t('Workflows/Tasks')}</strong> in der Sidebar, um den Task zu {t('Workflow pausiert. Öffne ')}
bearbeiten. <strong>{t('Workflows/Tasks')}</strong>
{t(' in der Sidebar, um den Task zu bearbeiten.')}
</> </>
) : ( ) : (
<> {executeResult.error ?? t('Unbekannter Fehler')}</> <>{executeResult.error ?? t('Unbekannter Fehler')}</>
)} )}
</div> </div>
)} )}