mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-14 17:37:46 +00:00
feat: add reset-to-default for widget parameters in right side panel (#8861)
## Summary Add per-widget and reset-all-parameters functionality to the right side panel, allowing users to quickly revert widget values to their defaults. ## Changes - **What**: Per-widget "Reset to default" option in the WidgetActions overflow menu, plus a "Reset all parameters" button in each SectionWidgets header. Defaults are derived from the InputSpec (explicit default, then type-specific fallbacks: 0 for INT/FLOAT, false for BOOLEAN, empty string for STRING, first option for COMBO). - **Dependencies**: Builds on #8594 (WidgetValueStore) for reactive UI updates after reset. ## Review Focus - `getWidgetDefaultValue` fallback logic in `src/utils/widgetUtil.ts` — are the type-specific defaults appropriate? - Deep equality check (`isEqual`) for disabling the reset button when the value already matches the default. - Event flow: WidgetActions emits `resetToDefault` → WidgetItem forwards → SectionWidgets handles via `writeWidgetValue` (sets value, triggers callback, marks canvas dirty). ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8861-feat-add-reset-to-default-for-widget-parameters-in-right-side-panel-3076d73d365081d1aa08d5b965a16cf4) by [Unito](https://www.unito.io) Co-authored-by: Terry Jia <terryjia88@gmail.com>
This commit is contained in:
46
src/utils/widgetUtil.test.ts
Normal file
46
src/utils/widgetUtil.test.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import type { InputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2'
|
||||
|
||||
import { getWidgetDefaultValue } from '@/utils/widgetUtil'
|
||||
|
||||
describe('getWidgetDefaultValue', () => {
|
||||
it('returns undefined for undefined spec', () => {
|
||||
expect(getWidgetDefaultValue(undefined)).toBeUndefined()
|
||||
})
|
||||
|
||||
it('returns explicit default when provided', () => {
|
||||
const spec = { type: 'INT', default: 42 } as InputSpec
|
||||
expect(getWidgetDefaultValue(spec)).toBe(42)
|
||||
})
|
||||
|
||||
it('returns 0 for INT type without default', () => {
|
||||
const spec = { type: 'INT' } as InputSpec
|
||||
expect(getWidgetDefaultValue(spec)).toBe(0)
|
||||
})
|
||||
|
||||
it('returns 0 for FLOAT type without default', () => {
|
||||
const spec = { type: 'FLOAT' } as InputSpec
|
||||
expect(getWidgetDefaultValue(spec)).toBe(0)
|
||||
})
|
||||
|
||||
it('returns false for BOOLEAN type without default', () => {
|
||||
const spec = { type: 'BOOLEAN' } as InputSpec
|
||||
expect(getWidgetDefaultValue(spec)).toBe(false)
|
||||
})
|
||||
|
||||
it('returns empty string for STRING type without default', () => {
|
||||
const spec = { type: 'STRING' } as InputSpec
|
||||
expect(getWidgetDefaultValue(spec)).toBe('')
|
||||
})
|
||||
|
||||
it('returns first option for array options without default', () => {
|
||||
const spec = { type: 'COMBO', options: ['a', 'b', 'c'] } as InputSpec
|
||||
expect(getWidgetDefaultValue(spec)).toBe('a')
|
||||
})
|
||||
|
||||
it('returns undefined for unknown type without options', () => {
|
||||
const spec = { type: 'CUSTOM' } as InputSpec
|
||||
expect(getWidgetDefaultValue(spec)).toBeUndefined()
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user