mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
## Summary Extracts desktop UI into apps/desktop-ui package with minimal changes. ## Changes - **What**: - Separates desktop-specific code into standalone package with independent Vite config, router, and i18n - Drastically simplifies the main app router by removing all desktop routes - Adds a some code duplication, most due to the existing design - Some duplication can be refactored to be *simpler* on either side - no need to split things by `isElectron()` - Rudimentary storybook support has been added - **Breaking**: Stacked PR for publishing must be merged before this PR makes it to stable core (but publishing _could_ be done manually) - #5915 - **Dependencies**: Takes full advantage of pnpm catalog. No additional dependencies added. ## Review Focus - Should be no changes to normal frontend operation - Scripts added to root package.json are acceptable - The duplication in this PR is copied as is, wherever possible. Any corrections or fix-ups beyond the scope of simply migrating the functionality as-is, can be addressed in later PRs. That said, if any changes are made, it instantly becomes more difficult to separate the duplicated code out into a shared utility. - Tracking issue to address concerns: #5925 ### i18n Fixing i18n is out of scope for this PR. It is a larger task that we should consider carefully and implement properly. Attempting to isolate the desktop i18n and duplicate the _current_ localisation scripts would be wasted energy.
89 lines
2.4 KiB
Vue
89 lines
2.4 KiB
Vue
<template>
|
|
<tr
|
|
class="border-neutral-700 border-solid border-y"
|
|
:class="{
|
|
'opacity-50': runner.resolved,
|
|
'opacity-75': isLoading && runner.resolved
|
|
}"
|
|
>
|
|
<td class="text-center w-16">
|
|
<TaskListStatusIcon :state="runner.state" :loading="isLoading" />
|
|
</td>
|
|
<td>
|
|
<p class="inline-block">
|
|
{{ task.name }}
|
|
</p>
|
|
<Button
|
|
class="inline-block mx-2"
|
|
type="button"
|
|
:icon="PrimeIcons.INFO_CIRCLE"
|
|
severity="secondary"
|
|
:text="true"
|
|
@click="toggle"
|
|
/>
|
|
|
|
<Popover ref="infoPopover" class="block m-1 max-w-64 min-w-32">
|
|
<span class="whitespace-pre-line">{{ task.description }}</span>
|
|
</Popover>
|
|
</td>
|
|
<td class="text-right px-4">
|
|
<Button
|
|
:icon="task.button?.icon"
|
|
:label="task.button?.text"
|
|
:severity
|
|
icon-pos="right"
|
|
:loading="isExecuting"
|
|
@click="(event) => $emit('execute', event)"
|
|
/>
|
|
</td>
|
|
</tr>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { PrimeIcons } from '@primevue/core/api'
|
|
import Button from 'primevue/button'
|
|
import Popover from 'primevue/popover'
|
|
import { computed, ref } from 'vue'
|
|
|
|
import { useMaintenanceTaskStore } from '@/stores/maintenanceTaskStore'
|
|
import type { MaintenanceTask } from '@/types/desktop/maintenanceTypes'
|
|
import type { PrimeVueSeverity } from '@/types/primeVueTypes'
|
|
import { useMinLoadingDurationRef } from '@/utils/refUtil'
|
|
|
|
import TaskListStatusIcon from './TaskListStatusIcon.vue'
|
|
|
|
const taskStore = useMaintenanceTaskStore()
|
|
const runner = computed(() => taskStore.getRunner(props.task))
|
|
|
|
// Properties
|
|
const props = defineProps<{
|
|
task: MaintenanceTask
|
|
}>()
|
|
|
|
// Events
|
|
defineEmits<{
|
|
execute: [event: MouseEvent]
|
|
}>()
|
|
|
|
// Binding
|
|
const severity = computed<PrimeVueSeverity>(() =>
|
|
runner.value.state === 'error' || runner.value.state === 'warning'
|
|
? 'primary'
|
|
: 'secondary'
|
|
)
|
|
|
|
// Use a minimum run time to ensure tasks "feel" like they have run
|
|
const reactiveLoading = computed(() => !!runner.value.refreshing)
|
|
const reactiveExecuting = computed(() => !!runner.value.executing)
|
|
|
|
const isLoading = useMinLoadingDurationRef(reactiveLoading, 250)
|
|
const isExecuting = useMinLoadingDurationRef(reactiveExecuting, 250)
|
|
|
|
// Popover
|
|
const infoPopover = ref<InstanceType<typeof Popover> | null>(null)
|
|
|
|
const toggle = (event: Event) => {
|
|
infoPopover.value?.toggle(event)
|
|
}
|
|
</script>
|