mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-23 16:00:38 +00:00
167 lines
4.0 KiB
TypeScript
167 lines
4.0 KiB
TypeScript
import type { FlowModule, OpenFlow } from '$lib/gen'
|
|
import { findGridItem } from '../apps/editor/appUtils'
|
|
import type { App } from '../apps/types'
|
|
|
|
export function setInputBySelector(selector: string, value: string) {
|
|
const input = document.querySelector(selector) as HTMLInputElement
|
|
|
|
if (input) {
|
|
input.value = value
|
|
input.dispatchEvent(new Event('input', { bubbles: true }))
|
|
}
|
|
}
|
|
|
|
export function clickButtonBySelector(selector: string) {
|
|
const button = document.querySelector(selector) as HTMLButtonElement
|
|
|
|
if (button) {
|
|
button.click()
|
|
}
|
|
}
|
|
|
|
export function clickFirstButtonBySelector(selector: string) {
|
|
const buttons = document.querySelector(selector)
|
|
const button = buttons?.childNodes[0] as HTMLButtonElement
|
|
|
|
if (button) {
|
|
button.click()
|
|
}
|
|
}
|
|
|
|
export function triggerAddFlowStep(index: number) {
|
|
const button = document.querySelector(`#flow-editor-add-step-${index}`) as HTMLButtonElement
|
|
|
|
if (button) {
|
|
button.parentElement?.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }))
|
|
}
|
|
}
|
|
|
|
export function selectFlowStepKind(index: number) {
|
|
const button = document.querySelector(
|
|
`#flow-editor-insert-module > div > button:nth-child(${index})`
|
|
) as HTMLButtonElement
|
|
|
|
if (button) {
|
|
button?.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }))
|
|
}
|
|
}
|
|
|
|
export function selectOptionsBySelector(selector: string, value: string) {
|
|
const select = document.querySelector(selector) as HTMLSelectElement
|
|
|
|
if (select) {
|
|
select.value = value
|
|
select.dispatchEvent(new Event('change', { bubbles: true }))
|
|
}
|
|
}
|
|
|
|
export function isFlowTainted(flow: OpenFlow) {
|
|
return (
|
|
flow.value.modules.length > 0 || Object.keys((flow?.schema?.properties as any) ?? {}).length > 0
|
|
)
|
|
}
|
|
|
|
export function isAppTainted(app: App) {
|
|
return !(app.grid.length === 0 && app.hiddenInlineScripts?.length === 0)
|
|
}
|
|
|
|
export function updateFlowModuleById(
|
|
flow: OpenFlow,
|
|
id: string,
|
|
callback: (module: FlowModule) => void
|
|
) {
|
|
const dfs = (modules: FlowModule[]) => {
|
|
for (const module of modules) {
|
|
if (module.id === id) {
|
|
callback(module)
|
|
return
|
|
}
|
|
|
|
if (module.value.type === 'forloopflow') {
|
|
dfs(module.value.modules)
|
|
} else if (module.value.type === 'branchone') {
|
|
module.value.branches.forEach((branch) => dfs(branch.modules))
|
|
} else if (module.value.type === 'branchall') {
|
|
module.value.branches.forEach((branch) => dfs(branch.modules))
|
|
}
|
|
}
|
|
}
|
|
|
|
dfs(flow.value.modules)
|
|
|
|
flow = flow
|
|
}
|
|
|
|
export function updateBackgroundRunnableCode(app: App, index: number, newCode: string) {
|
|
const script = app.hiddenInlineScripts[index]
|
|
if (script.type === 'runnableByName' && script.inlineScript) {
|
|
script.inlineScript.content = newCode
|
|
}
|
|
|
|
app = app
|
|
}
|
|
|
|
export function updateInlineRunnableCode(app: App, componentId: string, newCode: string) {
|
|
const gridItem = findGridItem(app, componentId)
|
|
|
|
if (gridItem?.data.componentInput?.type === 'runnable') {
|
|
if (
|
|
gridItem.data.componentInput.runnable?.type === 'runnableByName' &&
|
|
gridItem.data.componentInput.runnable.inlineScript
|
|
) {
|
|
gridItem.data.componentInput.runnable.inlineScript.content = newCode
|
|
}
|
|
}
|
|
|
|
app = app
|
|
}
|
|
|
|
export function connectComponentSourceToOutput(app: App, componentId: string, targetId: string) {
|
|
const gridItem = findGridItem(app, componentId)
|
|
|
|
if (gridItem) {
|
|
gridItem.data.componentInput = {
|
|
type: 'evalv2',
|
|
fieldType: 'object',
|
|
|
|
expr: `${targetId}.result`,
|
|
connections: [
|
|
{
|
|
componentId: targetId,
|
|
id: 'result'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
|
|
app = app
|
|
}
|
|
|
|
export function connectInlineRunnableInputToComponentOutput(
|
|
app: App,
|
|
sourceComponentId: string,
|
|
sourceField: string,
|
|
targetComponentId: string,
|
|
targetField: string,
|
|
fieldType: string = 'text'
|
|
) {
|
|
const gridItem = findGridItem(app, sourceComponentId)
|
|
|
|
if (gridItem?.data.componentInput?.type === 'runnable') {
|
|
// @ts-ignore
|
|
gridItem.data.componentInput.fields = {
|
|
[sourceField]: {
|
|
type: 'evalv2',
|
|
expr: `${targetComponentId}.${targetField}`,
|
|
fieldType: fieldType,
|
|
connections: [
|
|
{
|
|
componentId: targetComponentId,
|
|
id: targetField
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|