feat(checkpoints): add 'Send to Workflow' option in context menu

- Add 'Send to Workflow' menu item to checkpoint context menu (templates/checkpoints.html)
- Implement sendCheckpointToWorkflow() method in CheckpointContextMenu.js
- Use unified 'Model' terminology for toast messages instead of differentiating checkpoint/diffusion model
- Add translation keys: checkpoints.contextMenu.sendToWorkflow, uiHelpers.workflow.modelUpdated, modelFailed
- Complete translations for all 10 locales (en, zh-CN, zh-TW, ja, ko, de, fr, es, ru, he)
This commit is contained in:
Will Miao
2026-03-31 19:52:20 +08:00
parent 8dc2a2f76b
commit ba3f15dbc6
15 changed files with 115 additions and 32 deletions

View File

@@ -4,6 +4,8 @@ import { getModelApiClient, resetAndReload } from '../../api/modelApiFactory.js'
import { showDeleteModal, showExcludeModal } from '../../utils/modalUtils.js';
import { moveManager } from '../../managers/MoveManager.js';
import { i18n } from '../../i18n/index.js';
import { sendModelPathToWorkflow } from '../../utils/uiHelpers.js';
import { MODEL_TYPES } from '../../api/apiConfig.js';
export class CheckpointContextMenu extends BaseContextMenu {
constructor() {
@@ -60,6 +62,10 @@ export class CheckpointContextMenu extends BaseContextMenu {
this.currentCard.querySelector('.fa-copy').click();
}
break;
case 'sendworkflow':
// Send checkpoint to workflow (always replace mode)
this.sendCheckpointToWorkflow();
break;
case 'refresh-metadata':
// Refresh metadata from CivitAI
apiClient.refreshSingleModelMetadata(this.currentCard.dataset.filepath);
@@ -79,6 +85,52 @@ export class CheckpointContextMenu extends BaseContextMenu {
break;
}
}
async sendCheckpointToWorkflow() {
const modelPath = this.currentCard.dataset.filepath;
if (!modelPath) {
return;
}
const subtype = (this.currentCard.dataset.sub_type || 'checkpoint').toLowerCase();
const isDiffusionModel = subtype === 'diffusion_model';
const widgetName = isDiffusionModel ? 'unet_name' : 'ckpt_name';
const actionTypeText = i18n.t(
isDiffusionModel ? 'uiHelpers.nodeSelector.diffusionModel' : 'uiHelpers.nodeSelector.checkpoint',
{},
isDiffusionModel ? 'Diffusion Model' : 'Checkpoint'
);
const successMessage = i18n.t(
'uiHelpers.workflow.modelUpdated',
{},
'Model updated in workflow'
);
const failureMessage = i18n.t(
'uiHelpers.workflow.modelFailed',
{},
'Failed to update model node'
);
const missingNodesMessage = i18n.t(
'uiHelpers.workflow.noMatchingNodes',
{},
'No compatible nodes available in the current workflow'
);
const missingTargetMessage = i18n.t(
'uiHelpers.workflow.noTargetNodeSelected',
{},
'No target node selected'
);
await sendModelPathToWorkflow(modelPath, {
widgetName,
collectionType: MODEL_TYPES.CHECKPOINT,
actionTypeText,
successMessage,
failureMessage,
missingNodesMessage,
missingTargetMessage,
});
}
}
// Mix in shared methods