diff --git a/src/components/builder/AppBuilder.vue b/src/components/builder/AppBuilder.vue
index 1b1dedb80c..d14d30f31e 100644
--- a/src/components/builder/AppBuilder.vue
+++ b/src/components/builder/AppBuilder.vue
@@ -27,7 +27,7 @@ import { app } from '@/scripts/app'
import { DOMWidgetImpl } from '@/scripts/domWidget'
import { useDialogService } from '@/services/dialogService'
import { useAppMode } from '@/composables/useAppMode'
-import { useAppModeStore } from '@/stores/appModeStore'
+import { nodeTypeValidForApp, useAppModeStore } from '@/stores/appModeStore'
import { resolveNode } from '@/utils/litegraphUtil'
import { cn } from '@/utils/tailwindUtil'
import { HideLayoutFieldKey } from '@/types/widgetTypes'
@@ -162,7 +162,11 @@ function handleDown(e: MouseEvent) {
}
function handleClick(e: MouseEvent) {
const [node, widget] = getHovered(e) ?? []
- if (node?.mode !== LGraphEventMode.ALWAYS)
+ if (
+ node?.mode !== LGraphEventMode.ALWAYS ||
+ !nodeTypeValidForApp(node.type) ||
+ node.has_errors
+ )
return canvasInteractions.forwardEventToCanvas(e)
if (!widget) {
@@ -198,7 +202,9 @@ const renderedOutputs = computed(() => {
return canvas
.graph!.nodes.filter(
(n) =>
- n.constructor.nodeData?.output_node && n.mode === LGraphEventMode.ALWAYS
+ n.constructor.nodeData?.output_node &&
+ n.mode === LGraphEventMode.ALWAYS &&
+ !n.has_errors
)
.map(nodeToDisplayTuple)
})
diff --git a/src/locales/en/main.json b/src/locales/en/main.json
index 317946b995..582e3dffb3 100644
--- a/src/locales/en/main.json
+++ b/src/locales/en/main.json
@@ -3179,6 +3179,7 @@
"loadTemplate": "Load a template",
"cancelThisRun": "Cancel this run",
"deleteAllAssets": "Delete all assets from this run",
+ "hasCreditCost": "Requires additional credits",
"welcome": {
"title": "App Mode",
"message": "A simplified view that hides the node graph so you can focus on creating.",
diff --git a/src/renderer/extensions/linearMode/AppOutput.vue b/src/renderer/extensions/linearMode/AppOutput.vue
index 33b7fa559c..55a2057acd 100644
--- a/src/renderer/extensions/linearMode/AppOutput.vue
+++ b/src/renderer/extensions/linearMode/AppOutput.vue
@@ -25,7 +25,7 @@ function togglePromotion() {
import { useEventListener, useTimeout } from '@vueuse/core'
-import { partition, remove, takeWhile } from 'es-toolkit'
+import { remove, takeWhile } from 'es-toolkit'
import { storeToRefs } from 'pinia'
import { computed, ref, shallowRef } from 'vue'
import { useI18n } from 'vue-i18n'
@@ -19,6 +19,7 @@ import { useSettingStore } from '@/platform/settings/settingStore'
import { useTelemetry } from '@/platform/telemetry'
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
import DropZone from '@/renderer/extensions/linearMode/DropZone.vue'
+import PartnerNodesList from '@/renderer/extensions/linearMode/PartnerNodesList.vue'
import NodeWidgets from '@/renderer/extensions/vueNodes/components/NodeWidgets.vue'
import { api } from '@/scripts/api'
import { app } from '@/scripts/app'
@@ -119,20 +120,6 @@ function nodeToNodeData(node: LGraphNode) {
onDragOver: node.onDragOver
}
}
-const partitionedNodes = computed(() => {
- const parts = partition(
- graphNodes.value
- .filter((node) => node.mode === 0 && node.widgets?.length)
- .map(nodeToNodeData)
- .reverse(),
- (node) => ['MarkdownNote', 'Note'].includes(node.type)
- )
- for (const noteNode of parts[0]) {
- for (const widget of noteNode.widgets ?? [])
- widget.options = { ...widget.options, read_only: true }
- }
- return parts
-})
//TODO: refactor out of this file.
//code length is small, but changes should propagate
@@ -180,34 +167,6 @@ defineExpose({ runButtonClick })
v-text="workflowStore.activeWorkflow?.filename"
/>
-
-
-
-
-
-
+
+