mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-30 19:21:54 +00:00
Use store to manage nodeSearchService (#214)
This commit is contained in:
@@ -110,7 +110,9 @@ export class ComfyPage {
|
|||||||
}`,
|
}`,
|
||||||
});
|
});
|
||||||
await this.page.waitForFunction(() => document.fonts.ready);
|
await this.page.waitForFunction(() => document.fonts.ready);
|
||||||
await this.page.waitForFunction(() => window["app"] !== undefined);
|
await this.page.waitForFunction(
|
||||||
|
() => window["app"] !== undefined && window["app"].vueAppReady
|
||||||
|
);
|
||||||
await this.page.evaluate(() => {
|
await this.page.evaluate(() => {
|
||||||
window["app"]["canvas"].show_info = false;
|
window["app"]["canvas"].show_info = false;
|
||||||
});
|
});
|
||||||
|
|||||||
15
src/App.vue
15
src/App.vue
@@ -13,20 +13,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onMounted, onUnmounted, provide, ref, watch } from "vue";
|
import { computed, onMounted, ref, watch } from "vue";
|
||||||
import NodeSearchboxPopover from "@/components/NodeSearchBoxPopover.vue";
|
import NodeSearchboxPopover from "@/components/NodeSearchBoxPopover.vue";
|
||||||
import SideToolBar from "@/components/sidebar/SideToolBar.vue";
|
import SideToolBar from "@/components/sidebar/SideToolBar.vue";
|
||||||
import LiteGraphCanvasSplitterOverlay from "@/components/LiteGraphCanvasSplitterOverlay.vue";
|
import LiteGraphCanvasSplitterOverlay from "@/components/LiteGraphCanvasSplitterOverlay.vue";
|
||||||
import ProgressSpinner from "primevue/progressspinner";
|
import ProgressSpinner from "primevue/progressspinner";
|
||||||
import { NodeSearchService } from "./services/nodeSearchService";
|
|
||||||
import { app } from "./scripts/app";
|
import { app } from "./scripts/app";
|
||||||
import { useSettingStore } from "./stores/settingStore";
|
import { useSettingStore } from "./stores/settingStore";
|
||||||
import { useNodeDefStore } from "./stores/nodeDefStore";
|
import { useNodeDefStore } from "./stores/nodeDefStore";
|
||||||
|
|
||||||
const isLoading = ref(true);
|
const isLoading = ref(true);
|
||||||
const nodeSearchService = computed(
|
|
||||||
() => new NodeSearchService(useNodeDefStore().nodeDefs)
|
|
||||||
);
|
|
||||||
const nodeSearchEnabled = computed<boolean>(
|
const nodeSearchEnabled = computed<boolean>(
|
||||||
() => useSettingStore().get("Comfy.NodeSearchBoxImpl") === "default"
|
() => useSettingStore().get("Comfy.NodeSearchBoxImpl") === "default"
|
||||||
);
|
);
|
||||||
@@ -47,22 +43,21 @@ watch(
|
|||||||
{ immediate: true }
|
{ immediate: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
const init = async () => {
|
const init = () => {
|
||||||
useNodeDefStore().addNodeDefs(Object.values(app.nodeDefs));
|
useNodeDefStore().addNodeDefs(Object.values(app.nodeDefs));
|
||||||
useSettingStore().addSettings(app.ui.settings);
|
useSettingStore().addSettings(app.ui.settings);
|
||||||
|
app.vueAppReady = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(() => {
|
||||||
try {
|
try {
|
||||||
await init();
|
init();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Failed to init Vue app", e);
|
console.error("Failed to init Vue app", e);
|
||||||
} finally {
|
} finally {
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
provide("nodeSearchService", nodeSearchService);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|||||||
@@ -60,11 +60,9 @@ import Badge from "primevue/badge";
|
|||||||
import NodeSearchFilter from "@/components/NodeSearchFilter.vue";
|
import NodeSearchFilter from "@/components/NodeSearchFilter.vue";
|
||||||
import NodeSourceChip from "@/components/NodeSourceChip.vue";
|
import NodeSourceChip from "@/components/NodeSourceChip.vue";
|
||||||
import { ComfyNodeDef } from "@/types/apiTypes";
|
import { ComfyNodeDef } from "@/types/apiTypes";
|
||||||
import {
|
import { type FilterAndValue } from "@/services/nodeSearchService";
|
||||||
NodeSearchService,
|
|
||||||
type FilterAndValue,
|
|
||||||
} from "@/services/nodeSearchService";
|
|
||||||
import NodePreview from "./NodePreview.vue";
|
import NodePreview from "./NodePreview.vue";
|
||||||
|
import { useNodeDefStore } from "@/stores/nodeDefStore";
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
filters: {
|
filters: {
|
||||||
@@ -76,10 +74,6 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const nodeSearchService = (
|
|
||||||
inject("nodeSearchService") as Ref<NodeSearchService>
|
|
||||||
).value;
|
|
||||||
|
|
||||||
const inputId = `comfy-vue-node-search-box-input-${Math.random()}`;
|
const inputId = `comfy-vue-node-search-box-input-${Math.random()}`;
|
||||||
const suggestions = ref<ComfyNodeDef[]>([]);
|
const suggestions = ref<ComfyNodeDef[]>([]);
|
||||||
const hoveredSuggestion = ref<ComfyNodeDef | null>(null);
|
const hoveredSuggestion = ref<ComfyNodeDef | null>(null);
|
||||||
@@ -88,9 +82,13 @@ const placeholder = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const search = (query: string) => {
|
const search = (query: string) => {
|
||||||
suggestions.value = nodeSearchService.searchNode(query, props.filters, {
|
suggestions.value = useNodeDefStore().nodeSearchService.searchNode(
|
||||||
limit: props.searchLimit,
|
query,
|
||||||
});
|
props.filters,
|
||||||
|
{
|
||||||
|
limit: props.searchLimit,
|
||||||
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const emit = defineEmits(["addFilter", "removeFilter", "addNode"]);
|
const emit = defineEmits(["addFilter", "removeFilter", "addNode"]);
|
||||||
|
|||||||
@@ -32,11 +32,9 @@ import {
|
|||||||
LGraphNode,
|
LGraphNode,
|
||||||
LinkReleaseContext,
|
LinkReleaseContext,
|
||||||
} from "@comfyorg/litegraph";
|
} from "@comfyorg/litegraph";
|
||||||
import {
|
import { FilterAndValue } from "@/services/nodeSearchService";
|
||||||
FilterAndValue,
|
|
||||||
NodeSearchService,
|
|
||||||
} from "@/services/nodeSearchService";
|
|
||||||
import { ComfyNodeDef } from "@/types/apiTypes";
|
import { ComfyNodeDef } from "@/types/apiTypes";
|
||||||
|
import { useNodeDefStore } from "@/stores/nodeDefStore";
|
||||||
|
|
||||||
interface LiteGraphPointerEvent extends Event {
|
interface LiteGraphPointerEvent extends Event {
|
||||||
canvasX: number;
|
canvasX: number;
|
||||||
@@ -114,9 +112,6 @@ const addNode = (nodeDef: ComfyNodeDef) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const nodeSearchService = (
|
|
||||||
inject("nodeSearchService") as Ref<NodeSearchService>
|
|
||||||
).value;
|
|
||||||
|
|
||||||
const canvasEventHandler = (e: LiteGraphCanvasEvent) => {
|
const canvasEventHandler = (e: LiteGraphCanvasEvent) => {
|
||||||
const shiftPressed = (e.detail.originalEvent as KeyboardEvent).shiftKey;
|
const shiftPressed = (e.detail.originalEvent as KeyboardEvent).shiftKey;
|
||||||
@@ -128,9 +123,10 @@ const canvasEventHandler = (e: LiteGraphCanvasEvent) => {
|
|||||||
|
|
||||||
if (e.detail.subType === "empty-release") {
|
if (e.detail.subType === "empty-release") {
|
||||||
const destIsInput = e.detail.linkReleaseContext.node_from !== undefined;
|
const destIsInput = e.detail.linkReleaseContext.node_from !== undefined;
|
||||||
const filter = destIsInput
|
const filter = useNodeDefStore().nodeSearchService.getFilterById(
|
||||||
? nodeSearchService.getFilterById("input")
|
destIsInput ? "input" : "output"
|
||||||
: nodeSearchService.getFilterById("output");
|
);
|
||||||
|
|
||||||
const value = destIsInput
|
const value = destIsInput
|
||||||
? e.detail.linkReleaseContext.type_filter_in
|
? e.detail.linkReleaseContext.type_filter_in
|
||||||
: e.detail.linkReleaseContext.type_filter_out;
|
: e.detail.linkReleaseContext.type_filter_out;
|
||||||
@@ -172,6 +168,7 @@ onUnmounted(() => {
|
|||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
margin-top: 25vh;
|
margin-top: 25vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
.node-search-box-dialog-mask {
|
.node-search-box-dialog-mask {
|
||||||
align-items: flex-start !important;
|
align-items: flex-start !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,26 +34,22 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {
|
import { NodeFilter, type FilterAndValue } from "@/services/nodeSearchService";
|
||||||
NodeFilter,
|
|
||||||
NodeSearchService,
|
|
||||||
type FilterAndValue,
|
|
||||||
} from "@/services/nodeSearchService";
|
|
||||||
import Button from "primevue/button";
|
import Button from "primevue/button";
|
||||||
import Dialog from "primevue/dialog";
|
import Dialog from "primevue/dialog";
|
||||||
import SelectButton from "primevue/selectbutton";
|
import SelectButton from "primevue/selectbutton";
|
||||||
import AutoComplete from "primevue/autocomplete";
|
import AutoComplete from "primevue/autocomplete";
|
||||||
import { inject, ref, onMounted } from "vue";
|
import { ref, onMounted } from "vue";
|
||||||
|
import { useNodeDefStore } from "@/stores/nodeDefStore";
|
||||||
|
|
||||||
const visible = ref<boolean>(false);
|
const visible = ref<boolean>(false);
|
||||||
const nodeSearchService: NodeSearchService = inject("nodeSearchService").value;
|
|
||||||
|
|
||||||
const filters = ref<NodeFilter[]>([]);
|
const filters = ref<NodeFilter[]>([]);
|
||||||
const selectedFilter = ref<NodeFilter>();
|
const selectedFilter = ref<NodeFilter>();
|
||||||
const filterValues = ref<string[]>([]);
|
const filterValues = ref<string[]>([]);
|
||||||
const selectedFilterValue = ref<string>("");
|
const selectedFilterValue = ref<string>("");
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
const nodeSearchService = useNodeDefStore().nodeSearchService;
|
||||||
filters.value = nodeSearchService.nodeFilters;
|
filters.value = nodeSearchService.nodeFilters;
|
||||||
selectedFilter.value = nodeSearchService.nodeFilters[0];
|
selectedFilter.value = nodeSearchService.nodeFilters[0];
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -45,6 +45,4 @@ comfyApp.setup().then(() => {
|
|||||||
.use(pinia)
|
.use(pinia)
|
||||||
.use(i18n)
|
.use(i18n)
|
||||||
.mount("#vue-app");
|
.mount("#vue-app");
|
||||||
|
|
||||||
comfyApp.vueAppReady = true;
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { NodeSearchService } from "@/services/nodeSearchService";
|
||||||
import { ComfyNodeDef } from "@/types/apiTypes";
|
import { ComfyNodeDef } from "@/types/apiTypes";
|
||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
|
|
||||||
@@ -54,6 +55,9 @@ export const useNodeDefStore = defineStore("nodeDef", {
|
|||||||
nodeDefs(state) {
|
nodeDefs(state) {
|
||||||
return Object.values(state.nodeDefsByName);
|
return Object.values(state.nodeDefsByName);
|
||||||
},
|
},
|
||||||
|
nodeSearchService(state) {
|
||||||
|
return new NodeSearchService(Object.values(state.nodeDefsByName));
|
||||||
|
},
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
addNodeDef(nodeDef: ComfyNodeDef) {
|
addNodeDef(nodeDef: ComfyNodeDef) {
|
||||||
@@ -61,7 +65,7 @@ export const useNodeDefStore = defineStore("nodeDef", {
|
|||||||
},
|
},
|
||||||
addNodeDefs(nodeDefs: ComfyNodeDef[]) {
|
addNodeDefs(nodeDefs: ComfyNodeDef[]) {
|
||||||
for (const nodeDef of nodeDefs) {
|
for (const nodeDef of nodeDefs) {
|
||||||
this.addNodeDef(nodeDef);
|
this.nodeDefsByName[nodeDef.name] = nodeDef;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user