diff --git a/src/components/dialog/content/manager/infoPanel/MetadataRow.vue b/src/components/dialog/content/manager/infoPanel/MetadataRow.vue
index d8e55c9e2..68daa0d29 100644
--- a/src/components/dialog/content/manager/infoPanel/MetadataRow.vue
+++ b/src/components/dialog/content/manager/infoPanel/MetadataRow.vue
@@ -1,6 +1,6 @@
-
{{ label }}:
+
{{ label }}
{{ value }}
diff --git a/src/components/dialog/content/manager/infoPanel/tabs/DescriptionTabPanel.vue b/src/components/dialog/content/manager/infoPanel/tabs/DescriptionTabPanel.vue
index 439d26991..d966325dc 100644
--- a/src/components/dialog/content/manager/infoPanel/tabs/DescriptionTabPanel.vue
+++ b/src/components/dialog/content/manager/infoPanel/tabs/DescriptionTabPanel.vue
@@ -1,5 +1,5 @@
-
+
-
+
-
+
diff --git a/src/components/dialog/content/manager/infoPanel/tabs/WarningTabPanel.vue b/src/components/dialog/content/manager/infoPanel/tabs/WarningTabPanel.vue
new file mode 100644
index 000000000..30d196913
--- /dev/null
+++ b/src/components/dialog/content/manager/infoPanel/tabs/WarningTabPanel.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+ {{ getConflictMessage(conflict, $t) }}
+
+
+
+
+
+
+
diff --git a/src/components/dialog/content/manager/packBanner/PackBanner.vue b/src/components/dialog/content/manager/packBanner/PackBanner.vue
index 9a4631568..a7e81e8a9 100644
--- a/src/components/dialog/content/manager/packBanner/PackBanner.vue
+++ b/src/components/dialog/content/manager/packBanner/PackBanner.vue
@@ -1,5 +1,5 @@
-
+
-
-
-
-
+
+
- {{ $t('g.installing') }}...
-
-
-
-
-
-
-
- {{ nodePack.name }}
-
-
- {{ nodePack.description }}
-
-
-
-
- {{ nodesCount }} {{ $t('g.nodes') }}
-
-
-
- {{ formattedLatestVersionDate }}
-
+ {{ nodePack.name }}
+
+
+ {{ nodePack.description }}
+
+
+
+
+ {{ nodesCount }} {{ $t('g.nodes') }}
-
-
- {{ publisherName }}
-
+
+
+ {{ formattedLatestVersionDate }}
+
+
+ {{ publisherName }}
+
+
-
+
-
+
diff --git a/src/components/dialog/content/manager/packIcon/PackIcon.vue b/src/components/dialog/content/manager/packIcon/PackIcon.vue
index 47fd826cf..ae6d188c2 100644
--- a/src/components/dialog/content/manager/packIcon/PackIcon.vue
+++ b/src/components/dialog/content/manager/packIcon/PackIcon.vue
@@ -1,11 +1,37 @@
-
+
+
+
+
![default banner]()
+
+
+
+
+
+
+
![]()
+
+
diff --git a/src/components/dialog/content/manager/packIcon/PackIconStacked.vue b/src/components/dialog/content/manager/packIcon/PackIconStacked.vue
index 3815fb36c..475d5b9f6 100644
--- a/src/components/dialog/content/manager/packIcon/PackIconStacked.vue
+++ b/src/components/dialog/content/manager/packIcon/PackIconStacked.vue
@@ -1,25 +1,19 @@
-
+
-
-
- +{{ nodePacks.length - maxVisible }}
-
diff --git a/src/components/dialog/content/manager/registrySearchBar/RegistrySearchBar.vue b/src/components/dialog/content/manager/registrySearchBar/RegistrySearchBar.vue
index 05927a5f5..56cd0f98e 100644
--- a/src/components/dialog/content/manager/registrySearchBar/RegistrySearchBar.vue
+++ b/src/components/dialog/content/manager/registrySearchBar/RegistrySearchBar.vue
@@ -28,11 +28,14 @@
+
@@ -65,8 +68,10 @@ import { computed } from 'vue'
import { useI18n } from 'vue-i18n'
import PackInstallButton from '@/components/dialog/content/manager/button/PackInstallButton.vue'
+import PackUpdateButton from '@/components/dialog/content/manager/button/PackUpdateButton.vue'
import SearchFilterDropdown from '@/components/dialog/content/manager/registrySearchBar/SearchFilterDropdown.vue'
import { useMissingNodes } from '@/composables/nodePack/useMissingNodes'
+import { useUpdateAvailableNodes } from '@/composables/nodePack/useUpdateAvailableNodes'
import {
type SearchOption,
SortableAlgoliaField
@@ -83,6 +88,7 @@ const { searchResults, sortOptions } = defineProps<{
suggestions?: QuerySuggestion[]
sortOptions?: SortableField[]
isMissingTab?: boolean
+ isUpdateAvailableTab?: boolean
}>()
const searchQuery = defineModel
('searchQuery')
@@ -96,6 +102,10 @@ const { t } = useI18n()
// Get missing node packs from workflow with loading and error states
const { missingNodePacks, isLoading, error } = useMissingNodes()
+// Use the composable to get update available nodes
+const { hasUpdateAvailable, updateAvailableNodePacks } =
+ useUpdateAvailableNodes()
+
const hasResults = computed(
() => searchQuery.value?.trim() && searchResults?.length
)
diff --git a/src/components/dialog/content/manager/skeleton/PackCardSkeleton.vue b/src/components/dialog/content/manager/skeleton/PackCardSkeleton.vue
index 47396a0a4..fd8fbe964 100644
--- a/src/components/dialog/content/manager/skeleton/PackCardSkeleton.vue
+++ b/src/components/dialog/content/manager/skeleton/PackCardSkeleton.vue
@@ -1,10 +1,10 @@
-
+
@@ -17,7 +17,7 @@
-
-
+
diff --git a/src/components/dialog/content/setting/CreditsPanel.vue b/src/components/dialog/content/setting/CreditsPanel.vue
index 4d6486a98..374dfbe14 100644
--- a/src/components/dialog/content/setting/CreditsPanel.vue
+++ b/src/components/dialog/content/setting/CreditsPanel.vue
@@ -54,7 +54,7 @@
-
+
@@ -112,12 +112,12 @@ import Divider from 'primevue/divider'
import Skeleton from 'primevue/skeleton'
import TabPanel from 'primevue/tabpanel'
import { computed, ref, watch } from 'vue'
-import { useI18n } from 'vue-i18n'
import UserCredit from '@/components/common/UserCredit.vue'
import UsageLogsTable from '@/components/dialog/content/setting/UsageLogsTable.vue'
import { useFirebaseAuthActions } from '@/composables/auth/useFirebaseAuthActions'
import { useDialogService } from '@/services/dialogService'
+import { useCommandStore } from '@/stores/commandStore'
import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'
import { formatMetronomeCurrency } from '@/utils/formatUtil'
@@ -128,10 +128,10 @@ interface CreditHistoryItemData {
isPositive: boolean
}
-const { t } = useI18n()
const dialogService = useDialogService()
const authStore = useFirebaseAuthStore()
const authActions = useFirebaseAuthActions()
+const commandStore = useCommandStore()
const loading = computed(() => authStore.loading)
const balanceLoading = computed(() => authStore.isFetchingBalance)
@@ -160,15 +160,8 @@ const handleCreditsHistoryClick = async () => {
await authActions.accessBillingPortal()
}
-const handleMessageSupport = () => {
- dialogService.showIssueReportDialog({
- title: t('issueReport.contactSupportTitle'),
- subtitle: t('issueReport.contactSupportDescription'),
- panelProps: {
- errorType: 'BillingSupport',
- defaultFields: ['Workflow', 'Logs', 'SystemStats', 'Settings']
- }
- })
+const handleMessageSupport = async () => {
+ await commandStore.execute('Comfy.ContactSupport')
}
const handleFaqClick = () => {
diff --git a/src/components/dialog/content/setting/KeybindingPanel.vue b/src/components/dialog/content/setting/KeybindingPanel.vue
index 97a373421..dbe61f089 100644
--- a/src/components/dialog/content/setting/KeybindingPanel.vue
+++ b/src/components/dialog/content/setting/KeybindingPanel.vue
@@ -295,6 +295,8 @@ async function resetAllKeybindings() {