You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.6 KiB
158 lines
4.6 KiB
import { app } from "../../scripts/app.js"; |
|
import { api } from "../../scripts/api.js" |
|
import { ComfyDialog, $el } from "../../scripts/ui.js"; |
|
|
|
const LOCAL_STORAGE_KEY = "openart_comfy_workflow_key"; |
|
const DEFAULT_HOMEPAGE_URL = "https://openart.ai/workflows/dev?developer=true"; |
|
|
|
const style = ` |
|
.openart-share-dialog a { |
|
color: #f8f8f8; |
|
} |
|
.openart-share-dialog a:hover { |
|
color: #007bff; |
|
} |
|
`; |
|
|
|
export class OpenArtShareDialog extends ComfyDialog { |
|
static instance = null; |
|
|
|
constructor() { |
|
super(); |
|
$el("style", { |
|
textContent: style, |
|
parent: document.head, |
|
}); |
|
this.element = $el("div.comfy-modal.openart-share-dialog", { |
|
parent: document.body, style: { |
|
'overflow-y': "auto", |
|
} |
|
}, |
|
[$el("div.comfy-modal-content", |
|
{}, |
|
[...this.createButtons()]), |
|
]); |
|
this.selectedOutputIndex = 0; |
|
} |
|
readKeyFromLocalStorage() { |
|
return localStorage.getItem(LOCAL_STORAGE_KEY) || ''; |
|
} |
|
saveKeyToLocalStorage(value) { |
|
localStorage.setItem(LOCAL_STORAGE_KEY, value); |
|
} |
|
createButtons() { |
|
const sectionStyle = { |
|
marginBottom: '10px', |
|
padding: '15px', |
|
borderRadius: '8px', |
|
boxShadow: '0 2px 4px rgba(0, 0, 0, 0.05)' |
|
}; |
|
|
|
const inputStyle = { |
|
display: 'block', |
|
minWidth: '500px', |
|
width: '100%', |
|
padding: '10px', |
|
margin: '10px 0', |
|
borderRadius: '4px', |
|
border: '1px solid #ddd', |
|
boxSizing: 'border-box' |
|
}; |
|
|
|
const hyperLinkStyle = { |
|
display: 'block', |
|
marginBottom: '15px', |
|
fontWeight: 'bold', |
|
fontSize: '20px', |
|
}; |
|
|
|
const labelStyle = { |
|
color: "#f8f8f8", |
|
display: 'block', |
|
margin: '10px 0', |
|
fontWeight: 'bold', |
|
textDecoration: 'none', |
|
}; |
|
|
|
const buttonStyle = { |
|
padding: '10px 80px', |
|
margin: '10px 5px', |
|
borderRadius: '4px', |
|
border: 'none', |
|
cursor: 'pointer', |
|
color: '#fff', |
|
backgroundColor: '#007bff' |
|
}; |
|
|
|
// upload images input |
|
this.uploadImagesInput = $el("input", { type: 'file', multiple: false, style: inputStyle }) |
|
|
|
this.uploadImagesInput.addEventListener('change', async (e) => { |
|
const file = e.target.files[0]; |
|
if (!file) { |
|
return; |
|
} |
|
const reader = new FileReader(); |
|
reader.onload = async (e) => { |
|
const imgData = e.target.result; |
|
this.previewImage.src = imgData; |
|
}; |
|
reader.readAsDataURL(file); |
|
}); |
|
|
|
// preview image |
|
this.previewImage = $el("img", { src: "", style: { maxWidth: '100%', maxHeight: '100px' } }); |
|
|
|
this.keyInput = $el("input", { type: 'text', placeholder: "Copy & paste your API key", style: inputStyle }) |
|
// Account Section |
|
const AccountSection = $el("div", { style: sectionStyle }, [ |
|
$el("a", { style: hyperLinkStyle, href: DEFAULT_HOMEPAGE_URL }, ["Check out 1000+ workflows others have uploaded."]), |
|
$el("a", { style: hyperLinkStyle, href: DEFAULT_HOMEPAGE_URL }, ["You can get API key at here."]), |
|
$el("label", { style: labelStyle }, ["OpenArt API Key"]), |
|
this.keyInput, |
|
]); |
|
|
|
// Additional Inputs Section |
|
const additionalInputsSection = $el("div", { style: sectionStyle }, [ |
|
$el("label", { style: labelStyle }, ["Image/Thumbnail (Required)"]), |
|
this.uploadImagesInput, |
|
this.previewImage, |
|
$el("label", { style: labelStyle }, ["Workflow Information"]), |
|
$el("input", { type: "text", placeholder: "Name (required)", style: inputStyle }), |
|
$el("textarea", { placeholder: "Description (optional)", style: { |
|
...inputStyle, |
|
minHeight: '100px', |
|
} }), |
|
]); |
|
|
|
// Share and Close Buttons |
|
const buttonsSection = $el("div", { style: { textAlign: 'right', marginTop: '20px', display: 'flex', justifyContent: 'space-between' } }, [ |
|
$el("button", { type: "button", textContent: "Close", style: { |
|
...buttonStyle, |
|
backgroundColor: undefined |
|
}, onclick: () => { this.close(); } }), |
|
$el("button", { type: "submit", textContent: "Share", style: buttonStyle, onclick: () => { this.share(); } }), |
|
]); |
|
|
|
// Final Message Section |
|
const finalMessage = $el("div", { style: { color: "white", textAlign: "center", padding: "10px" } }, []); |
|
// Composing the full layout |
|
const layout = [ |
|
AccountSection, |
|
additionalInputsSection, |
|
buttonsSection, |
|
finalMessage, |
|
]; |
|
|
|
return layout; |
|
} |
|
async share() { |
|
this.saveKeyToLocalStorage(this.keyInput.value); |
|
} |
|
show({ potential_outputs, potential_output_nodes }) { |
|
this.element.style.display = "block"; |
|
// read key from local storage and set it to the input |
|
const key = this.readKeyFromLocalStorage(); |
|
this.keyInput.value = key; |
|
} |
|
} |