Add clone support for all entity types

Clone button on every card opens the editor in create mode pre-filled
with copied data and a "(Copy)" name suffix. Cancelling discards the
clone — entity is only persisted on Save.

Supported: LED targets, color strip sources, KC targets, pattern
templates, picture sources, capture templates, PP templates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 15:38:40 +03:00
parent f15ff8fea0
commit cc08bb1c19
8 changed files with 238 additions and 29 deletions

View File

@@ -53,12 +53,14 @@ import {
showAddPPTemplateModal, editPPTemplate, closePPTemplateModal, savePPTemplate, deletePPTemplate,
addFilterFromSelect, toggleFilterExpand, removeFilter, moveFilter, updateFilterOption,
renderModalFilterList, updateCaptureDuration,
cloneStream, cloneCaptureTemplate, clonePPTemplate,
} from './features/streams.js';
import {
createKCTargetCard, testKCTarget, toggleKCTestAutoRefresh,
showKCEditor, closeKCEditorModal, forceCloseKCEditorModal, saveKCEditor,
deleteKCTarget, disconnectAllKCWebSockets,
updateKCBrightnessLabel, saveKCBrightness,
cloneKCTarget,
} from './features/kc-targets.js';
import {
createPatternTemplateCard,
@@ -67,6 +69,7 @@ import {
renderPatternRectList, selectPatternRect, updatePatternRect,
addPatternRect, deleteSelectedPatternRect, removePatternRect,
capturePatternBackground,
clonePatternTemplate,
} from './features/pattern-templates.js';
import {
loadProfiles, openProfileEditor, closeProfileEditorModal,
@@ -85,6 +88,7 @@ import {
addTargetSegment, removeTargetSegment,
startTargetProcessing, stopTargetProcessing,
startTargetOverlay, stopTargetOverlay, deleteTarget,
cloneTarget,
} from './features/targets.js';
// Layer 5: color-strip sources
@@ -95,6 +99,7 @@ import {
compositeAddLayer, compositeRemoveLayer,
onAudioVizChange,
applyGradientPreset,
cloneColorStrip,
} from './features/color-strips.js';
// Layer 5: calibration
@@ -210,6 +215,9 @@ Object.assign(window, {
moveFilter,
updateFilterOption,
renderModalFilterList,
cloneStream,
cloneCaptureTemplate,
clonePPTemplate,
// kc-targets
createKCTargetCard,
@@ -223,6 +231,7 @@ Object.assign(window, {
disconnectAllKCWebSockets,
updateKCBrightnessLabel,
saveKCBrightness,
cloneKCTarget,
// pattern-templates
createPatternTemplateCard,
@@ -238,6 +247,7 @@ Object.assign(window, {
deleteSelectedPatternRect,
removePatternRect,
capturePatternBackground,
clonePatternTemplate,
// profiles
loadProfiles,
@@ -273,6 +283,7 @@ Object.assign(window, {
startTargetOverlay,
stopTargetOverlay,
deleteTarget,
cloneTarget,
// color-strip sources
showCSSEditor,
@@ -290,6 +301,7 @@ Object.assign(window, {
compositeRemoveLayer,
onAudioVizChange,
applyGradientPreset,
cloneColorStrip,
// calibration
showCalibration,