mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-15 01:48:06 +00:00
## Summary - Merged separate Cloud and OSS workflow warning modals into single unified modal - Removed legacy LoadWorkflowWarning.vue - Renamed CloudMissingNodes* components to MissingNodes* for clarity - Environment branching now handled internally via isCloud flag - Restructured i18n: removed loadWorkflowWarning, added missingNodes.cloud/oss sections - Improved OSS button styling to match Cloud consistency ## Key Changes - **OSS**: "Open Manager" + "Install All" buttons - **Cloud**: "Learn More" + "Got It" buttons (unchanged) - Single unified modal displays different UI/text based on environment ## 📝 Note on File Renames This PR renames the following files: - `CloudMissingNodesHeader.vue` → `MissingNodesHeader.vue` (R053, 53% similarity) - `CloudMissingNodesContent.vue` → `MissingNodesContent.vue` (R067, 67% similarity) - `LoadWorkflowWarning.vue` → `MissingNodesFooter.vue` (R051, 51% similarity) - `CloudMissingNodesFooter.vue` → Deleted (replaced by new MissingNodesFooter) **Why GitHub PR UI doesn't show renames properly:** GitHub detects renames only when file similarity is above 70%. In this PR, the Cloud/OSS unification significantly modified file contents, resulting in 51-67% similarity. However, **Git history correctly records these as renames**. You can verify with: ```bash git show <commit-hash> --name-status ``` While GitHub UI shows "additions/deletions", these are actually rename + modification operations. ## Test Plan - [x] Test OSS mode: missing nodes modal shows "Open Manager" and "Install All" buttons - [x] Test Cloud mode: missing nodes modal shows "Learn More" and "Got It" buttons - [x] Verify Install All button functionality in OSS - [x] Verify modal closes automatically after all nodes are installed (OSS) [missingnodes.webm](https://github.com/user-attachments/assets/36d3b4b0-ff8b-4b45-824c-3bc15d93f1a2) 🤖 Generated with [Claude Code](https://claude.com/claude-code) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6673-refactor-Unify-Cloud-OSS-Missing-Nodes-modal-2aa6d73d365081a88827d0fa85db4c63) by [Unito](https://www.unito.io) --------- Co-authored-by: Claude <noreply@anthropic.com>
84 lines
2.4 KiB
Vue
84 lines
2.4 KiB
Vue
<template>
|
|
<div
|
|
class="flex w-[490px] flex-col border-t-1 border-b-1 border-border-default"
|
|
>
|
|
<div class="flex h-full w-full flex-col gap-4 p-4">
|
|
<!-- Description -->
|
|
<div>
|
|
<p class="m-0 text-sm leading-4 text-muted-foreground">
|
|
{{
|
|
isCloud
|
|
? $t('missingNodes.cloud.description')
|
|
: $t('missingNodes.oss.description')
|
|
}}
|
|
</p>
|
|
</div>
|
|
<MissingCoreNodesMessage v-if="!isCloud" :missing-core-nodes />
|
|
|
|
<!-- Missing Nodes List Wrapper -->
|
|
<div
|
|
class="comfy-missing-nodes flex flex-col max-h-[256px] rounded-lg py-2 scrollbar-custom bg-secondary-background"
|
|
>
|
|
<div
|
|
v-for="(node, i) in uniqueNodes"
|
|
:key="i"
|
|
class="flex min-h-8 items-center justify-between px-4 py-2 bg-secondary-background text-muted-foreground"
|
|
>
|
|
<span class="text-xs">
|
|
{{ node.label }}
|
|
</span>
|
|
<span v-if="node.hint" class="text-xs">{{ node.hint }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Bottom instruction -->
|
|
<div>
|
|
<p class="m-0 text-sm leading-4 text-muted-foreground">
|
|
{{
|
|
isCloud
|
|
? $t('missingNodes.cloud.replacementInstruction')
|
|
: $t('missingNodes.oss.replacementInstruction')
|
|
}}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { computed } from 'vue'
|
|
|
|
import MissingCoreNodesMessage from '@/components/dialog/content/MissingCoreNodesMessage.vue'
|
|
import { isCloud } from '@/platform/distribution/types'
|
|
import type { MissingNodeType } from '@/types/comfy'
|
|
import { useMissingNodes } from '@/workbench/extensions/manager/composables/nodePack/useMissingNodes'
|
|
|
|
const props = defineProps<{
|
|
missingNodeTypes: MissingNodeType[]
|
|
}>()
|
|
|
|
// Get missing core nodes for OSS mode
|
|
const { missingCoreNodes } = useMissingNodes()
|
|
|
|
const uniqueNodes = computed(() => {
|
|
const seenTypes = new Set()
|
|
return props.missingNodeTypes
|
|
.filter((node) => {
|
|
const type = typeof node === 'object' ? node.type : node
|
|
if (seenTypes.has(type)) return false
|
|
seenTypes.add(type)
|
|
return true
|
|
})
|
|
.map((node) => {
|
|
if (typeof node === 'object') {
|
|
return {
|
|
label: node.type,
|
|
hint: node.hint,
|
|
action: node.action
|
|
}
|
|
}
|
|
return { label: node }
|
|
})
|
|
})
|
|
</script>
|