diff --git a/src/wwwroot/js/genpage/gentab/params.js b/src/wwwroot/js/genpage/gentab/params.js
index 80aa5341d..ea22472e4 100644
--- a/src/wwwroot/js/genpage/gentab/params.js
+++ b/src/wwwroot/js/genpage/gentab/params.js
@@ -814,7 +814,7 @@ function genInputs(delay_final = false) {
let controlnetGroup = document.getElementById('input_group_content_controlnet');
if (controlnetGroup) {
let firstGroup = controlnetGroup.querySelector('.input-group');
- let buttonDiv = createDiv(`controlnet_button_preview`, null, ``);
+ let buttonDiv = createDiv(`controlnet_button_preview`, null, ` `);
if (firstGroup) {
controlnetGroup.insertBefore(buttonDiv, firstGroup);
}
@@ -1452,7 +1452,7 @@ function debugShowHiddenParams() {
}
/** Loads and shows a preview of ControlNet preprocessing to the user. */
-function controlnetShowPreview() {
+function controlnetShowPreview(callback) {
let toggler = getRequiredElementById('input_group_content_controlnet_toggle');
if (!toggler.checked) {
toggler.checked = true;
@@ -1465,10 +1465,10 @@ function controlnetShowPreview() {
}
let previewArea = getRequiredElementById('controlnet_button_preview');
let clearPreview = () => {
- let lastResult = previewArea.querySelector('.controlnet-preview-result');
- if (lastResult) {
- lastResult.remove();
+ for (let result of previewArea.querySelectorAll('.controlnet-preview-result, .controlnet-save-result')) {
+ result.remove();
}
+ delete previewArea.dataset.controlnetPreviewImage;
};
clearPreview();
let imgInput = getRequiredElementById('input_controlnetimageinput');
@@ -1510,11 +1510,55 @@ function controlnetShowPreview() {
resultBox.append(imgElem);
}
clearPreview();
+ previewArea.dataset.controlnetPreviewImage = data.image;
previewArea.append(resultBox);
+ if (callback) {
+ callback(data);
+ }
});
});
}
+/** Saves a ControlNet preview data URL through the existing history save route. */
+function controlnetSavePreviewDataToServer(image) {
+ let now = new Date();
+ let pad = (val) => `${val}`.padStart(2, '0');
+ let millis = `${now.getMilliseconds()}`.padStart(3, '0');
+ let name = `controlnet-preview-${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}_${pad(now.getHours())}-${pad(now.getMinutes())}-${pad(now.getSeconds())}-${millis}`;
+ let data = {
+ image: image,
+ ['Override Outpath Format']: `inputs/controlnet/${name}`
+ };
+ genericRequest('AddImageToHistory', data, res => {
+ let previewArea = getRequiredElementById('controlnet_button_preview');
+ let oldSaveResult = previewArea.querySelector('.controlnet-save-result');
+ if (oldSaveResult) {
+ oldSaveResult.remove();
+ }
+ let saveResult = createDiv(null, 'controlnet-save-result modal_success_bottom', 'Saved ControlNet preview.');
+ previewArea.append(saveResult);
+ setTimeout(() => {
+ saveResult.remove();
+ }, 5000);
+ });
+}
+
+/** Saves the current ControlNet preview, generating it first if needed. */
+function controlnetSavePreviewToServer() {
+ let previewArea = getRequiredElementById('controlnet_button_preview');
+ let image = previewArea.dataset.controlnetPreviewImage;
+ if (image) {
+ controlnetSavePreviewDataToServer(image);
+ return;
+ }
+ controlnetShowPreview(data => {
+ if (!data || !data.image) {
+ return;
+ }
+ controlnetSavePreviewDataToServer(data.image);
+ });
+}
+
/** Gets the parameter with a given ID, from either the current param set, or the raw set from server. If unavailable, returns null. */
function getParamById(id) {
if (!gen_param_types) {