{#each Object.entries($staticOutputs) as [componentId, outputs], index}
- {#if outputs.length > 0}
+ {#if outputs.length > 0 && $worldStore?.outputsById[componentId]}
Component: {componentId}
@@ -160,8 +161,7 @@
{outputs}
{componentId}
on:select={({ detail }) => {
- const [output] = detail.split('.')
- connectInput(componentId, output)
+ connectInput(componentId, detail)
}}
/>
diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte
index 14d0b3d91a..82357c2fd1 100644
--- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte
+++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte
@@ -26,8 +26,7 @@
function removeGridElement() {
if (component) {
const COLS = 6
- const index = $app.grid.findIndex((gridComponent) => gridComponent.data.id === component?.id)
- $app.grid.splice(index, 1)
+ $app.grid = $app.grid.filter((gridComponent) => gridComponent.data.id !== component?.id)
$app.grid = gridHelp.adjust($app.grid, COLS)
// Delete static inputs
diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte
index f5acd41cd1..ff24e2d03e 100644
--- a/frontend/src/lib/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte
+++ b/frontend/src/lib/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte
@@ -8,7 +8,7 @@
export let inputSpecs: InputsSpec
const userTypeKeys = ['schemaProperty', 'defaultValue', 'value']
- const staticTypeKeys = ['visible', 'value', 'fieldType']
+ const staticTypeKeys = ['value']
const dynamicTypeKeys = ['id', 'name', 'defaultValue']
function sanitizeInputSpec(type: 'user' | 'static' | 'output', inputSpecKey: string) {
diff --git a/frontend/src/lib/components/apps/rx.ts b/frontend/src/lib/components/apps/rx.ts
index 1321c5ca93..0e2dbe56eb 100644
--- a/frontend/src/lib/components/apps/rx.ts
+++ b/frontend/src/lib/components/apps/rx.ts
@@ -45,10 +45,13 @@ export function buildObservableWorld() {
}
} else if (inputSpec.type === 'output') {
const input = cachedInput(next)
- let obs = observables[`${inputSpec.id}.${inputSpec.name}`]
+
+ const [name] = inputSpec.name ? inputSpec.name.split('.') : [undefined]
+
+ let obs = observables[`${inputSpec.id}.${name}`]
if (!obs) {
- console.warn('Observable at ' + inputSpec.id + '.' + inputSpec.name + ' not found')
+ console.warn('Observable at ' + inputSpec.id + '.' + name + ' not found')
return {
peak: () => undefined,
next: () => {}
diff --git a/frontend/src/lib/components/apps/utils.ts b/frontend/src/lib/components/apps/utils.ts
index 9792be0741..e4176d3940 100644
--- a/frontend/src/lib/components/apps/utils.ts
+++ b/frontend/src/lib/components/apps/utils.ts
@@ -73,3 +73,23 @@ export const displayData = {
icon: faBarChart
}
}
+
+export function accessPropertyByPath(object: T, path: string): T | undefined {
+ // convert indexes to properties
+ path = path.replace(/\[(\w+)\]/g, '.$1')
+ // strip a leading dot
+ path = path.replace(/^\./, '')
+
+ let a = path.split('.')
+
+ for (let i = 0, depth = a.length; i < depth; ++i) {
+ let key = a[i]
+ if (object[key]) {
+ object = object[key]
+ } else {
+ // Value not found
+ return
+ }
+ }
+ return object
+}