Add Download button to in-play Scripts panel
Each script in the panel can now be downloaded as an import-compatible JSON bundle (matching the /scripts export format), so demo/server-owned scripts can be forked into a user's own library via the Scripts page's Import. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TEpWMjnfPqzZ13nPMoGhs5
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
73f43efbe7
commit
36413acd3e
@@ -303,6 +303,22 @@ function ScriptsPanel({ advId }) {
|
|||||||
setScripts((prev) => prev.map((s) => (s.id === script.id ? updated : s)))
|
setScripts((prev) => prev.map((s) => (s.id === script.id ? updated : s)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Download as an import-compatible bundle (matches /scripts export), so demo
|
||||||
|
// scripts can be forked into your own library via the Scripts page's Import.
|
||||||
|
const download = (s) => {
|
||||||
|
downloadJSON(
|
||||||
|
{
|
||||||
|
name: s.name,
|
||||||
|
description: s.description,
|
||||||
|
library: s.library_js,
|
||||||
|
input: s.input_js,
|
||||||
|
context: s.context_js,
|
||||||
|
output: s.output_js,
|
||||||
|
},
|
||||||
|
`${(s.name || 'script').replace(/\W+/g, '-')}.json`,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (!scripts) return <div className="empty">Loading…</div>
|
if (!scripts) return <div className="empty">Loading…</div>
|
||||||
if (scripts.length === 0) {
|
if (scripts.length === 0) {
|
||||||
return (
|
return (
|
||||||
@@ -324,9 +340,12 @@ function ScriptsPanel({ advId }) {
|
|||||||
<input type="checkbox" checked={s.enabled} onChange={() => toggle(s)} />
|
<input type="checkbox" checked={s.enabled} onChange={() => toggle(s)} />
|
||||||
<span>{s.name}</span>
|
<span>{s.name}</span>
|
||||||
</label>
|
</label>
|
||||||
|
<div style={{ display: 'flex', gap: 12, flexShrink: 0 }}>
|
||||||
<button className="linklike" onClick={() => setOpenId(open ? null : s.id)}>
|
<button className="linklike" onClick={() => setOpenId(open ? null : s.id)}>
|
||||||
{open ? 'Hide code' : 'View code'}
|
{open ? 'Hide code' : 'View code'}
|
||||||
</button>
|
</button>
|
||||||
|
<button className="linklike" onClick={() => download(s)}>Download</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{s.description && <div className="dim adv-script-desc">{s.description}</div>}
|
{s.description && <div className="dim adv-script-desc">{s.description}</div>}
|
||||||
{open && (
|
{open && (
|
||||||
|
|||||||
Reference in New Issue
Block a user