parent
7e71cbd6a3
commit
24956e430c
@ -0,0 +1,87 @@ |
||||
import { IframePlugin, IframeProfile, ViewPlugin } from '@remixproject/engine-web' |
||||
import * as packageJson from '../../../../../package.json' |
||||
import React from 'react' // eslint-disable-line
|
||||
import { ScriptRunnerUI } from '@remix-scriptrunner' // eslint-disable-line
|
||||
import { Profile } from '@remixproject/plugin-utils' |
||||
import { Engine } from '@remixproject/engine' |
||||
const profile = { |
||||
name: 'scriptRunnerBridge', |
||||
displayName: 'Script Bridge', |
||||
methods: ['execute'], |
||||
events: ['log', 'info', 'warn', 'error'], |
||||
icon: 'assets/img/settings.webp', |
||||
description: 'Set up a script runner', |
||||
kind: '', |
||||
location: 'sidePanel', |
||||
version: packageJson.version, |
||||
maintainedBy: 'Remix' |
||||
} |
||||
|
||||
export class ScriptRunnerUIPlugin extends ViewPlugin { |
||||
engine: Engine |
||||
current: string |
||||
constructor(engine: Engine) { |
||||
super(profile) |
||||
console.log('ScriptRunnerUIPlugin', this) |
||||
this.engine = engine |
||||
} |
||||
|
||||
async onActivation () { |
||||
console.log('onActivation', this) |
||||
} |
||||
|
||||
async loadScriptRunner(name: string) { |
||||
console.log('loadScriptRunner', name, this) |
||||
const profile: IframeProfile = await this.call('manager', 'getProfile', 'scriptRunner') |
||||
const newProfile: IframeProfile = { |
||||
...profile, |
||||
name: profile.name + name, |
||||
url: 'http://localhost:3000?template=' + name |
||||
} |
||||
console.log('loadScriptRunner', newProfile) |
||||
const plugin: IframePlugin = new IframePlugin(newProfile) |
||||
await this.engine.register(plugin) |
||||
|
||||
await this.call('manager', 'activatePlugin', newProfile.name) |
||||
this.current = newProfile.name |
||||
this.on(newProfile.name, 'log', this.log.bind(this)) |
||||
this.on(newProfile.name, 'info', this.log.bind(this)) |
||||
this.on(newProfile.name, 'warn', this.log.bind(this)) |
||||
this.on(newProfile.name, 'error', this.log.bind(this)) |
||||
} |
||||
|
||||
async execute (script: string, filePath: string) { |
||||
if(!this.current) await this.loadScriptRunner('default') |
||||
console.log('execute', script, filePath) |
||||
this.call(this.current, 'execute', script, filePath) |
||||
} |
||||
|
||||
async log(data: any){ |
||||
console.log('log', data) |
||||
this.emit('log', data) |
||||
} |
||||
|
||||
async warn(data: any){ |
||||
console.log('warn', data) |
||||
this.emit('warn', data) |
||||
} |
||||
|
||||
async error(data: any){ |
||||
console.log('error', data) |
||||
this.emit('error', data) |
||||
} |
||||
|
||||
async info(data: any){ |
||||
console.log('info', data) |
||||
this.emit('info', data) |
||||
} |
||||
|
||||
|
||||
render() { |
||||
return ( |
||||
<div id="scriptRunnerTab"> |
||||
<ScriptRunnerUI loadScriptRunner={this.loadScriptRunner.bind(this)} /> |
||||
</div> |
||||
) |
||||
} |
||||
} |
@ -0,0 +1 @@ |
||||
export { ScriptRunnerUI } from './lib/script-runner-ui'; |
@ -0,0 +1,83 @@ |
||||
import React, { useEffect, useState } from "react"; |
||||
import { Accordion, Card, Button } from "react-bootstrap"; |
||||
import axios from "axios"; |
||||
import { ProjectConfiguration } from "./types"; |
||||
import { FormattedMessage } from "react-intl"; |
||||
import { faCheck, faToggleOn } from "@fortawesome/free-solid-svg-icons"; |
||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; |
||||
import { Profile } from "@remixproject/plugin-utils"; |
||||
import { IframeProfile, ViewProfile } from "@remixproject/engine-web"; |
||||
import { Plugin } from "@remixproject/engine"; |
||||
|
||||
export interface ScriptRunnerUIProps { |
||||
// Add your props here
|
||||
loadScriptRunner: (name: string) => void; |
||||
} |
||||
|
||||
export const ScriptRunnerUI = (props: ScriptRunnerUIProps) => { |
||||
const { loadScriptRunner } = props; |
||||
const [configurations, setConfigurations] = useState([]); |
||||
const [activeKey, setActiveKey] = useState('default'); |
||||
const [activeConfig, setActiveConfig] = useState('default'); |
||||
|
||||
useEffect(() => { |
||||
// Fetch the JSON data from the localhost server using Axios
|
||||
const fetchData = async () => { |
||||
try { |
||||
const response = await axios.get('http://localhost:3000/projects.json'); |
||||
setConfigurations(response.data); |
||||
} catch (error) { |
||||
console.error("Error fetching the projects data:", error); |
||||
} |
||||
}; |
||||
|
||||
fetchData(); |
||||
}, []); // Empty array ensures this effect runs once when the component mounts
|
||||
|
||||
const handleSelect = (key) => { |
||||
console.log("Selected key:", key, activeKey); |
||||
setActiveConfig(key); |
||||
console.log(loadScriptRunner) |
||||
loadScriptRunner(key) |
||||
}; |
||||
|
||||
// Filter out unpublished configurations
|
||||
const publishedConfigurations = configurations.filter((config) => config.publish); |
||||
|
||||
return ( |
||||
<div className="px-1"> |
||||
<Accordion defaultActiveKey="default"> |
||||
{publishedConfigurations.map((config: ProjectConfiguration, index) => ( |
||||
<div key={index}> |
||||
<div className="d-flex align-items-baseline justify-content-between"> |
||||
<Accordion.Toggle as={Button} variant="link" eventKey={config.name}> |
||||
<span className="pl-2">{config.name}</span> |
||||
</Accordion.Toggle> |
||||
<div onClick={() => handleSelect(config.name)} className="pointer px-2"> |
||||
{activeConfig !== config.name ? |
||||
<FontAwesomeIcon icon={faToggleOn}></FontAwesomeIcon> : |
||||
<FontAwesomeIcon className="text-success" icon={faCheck}></FontAwesomeIcon> |
||||
} |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<Accordion.Collapse className="px-4" eventKey={config.name}> |
||||
<> |
||||
<p><strong>Description: </strong>{config.description}</p> |
||||
<p><strong>Dependencies:</strong></p> |
||||
<ul> |
||||
{config.dependencies.map((dep, depIndex) => ( |
||||
<li key={depIndex}> |
||||
<strong>{dep.name}</strong> (v{dep.version}) |
||||
</li> |
||||
))} |
||||
</ul></> |
||||
</Accordion.Collapse></div>))} |
||||
</Accordion> |
||||
|
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
|
@ -0,0 +1,20 @@ |
||||
export interface Dependency { |
||||
version: string; |
||||
name: string; |
||||
alias?: string; |
||||
import: boolean; |
||||
require?: boolean; |
||||
windowImport?: boolean; |
||||
} |
||||
|
||||
export interface Replacements { |
||||
[key: string]: string; |
||||
} |
||||
|
||||
export interface ProjectConfiguration { |
||||
name: string; |
||||
publish: boolean; |
||||
description: string; |
||||
dependencies: Dependency[]; |
||||
replacements: Replacements; |
||||
} |
Loading…
Reference in new issue