From 6da2cf7b4d97cf01d663fa1959f4b486b80bdbd3 Mon Sep 17 00:00:00 2001 From: Rizumu Ayaka Date: Tue, 9 Sep 2025 14:34:07 +0800 Subject: [PATCH] feat: vue based input number widget (#5435) * feat: vue based input number widget * fix: remove min and max --- .../widgets/components/WidgetInputNumber.vue | 27 ++++++ .../components/WidgetInputNumberInput.vue | 91 +++++++++++++++++++ ...est.ts => WidgetInputNumberSlider.test.ts} | 6 +- ...Slider.vue => WidgetInputNumberSlider.vue} | 2 - .../widgets/registry/widgetRegistry.ts | 6 +- .../composables/useWidgetRenderer.test.ts | 14 +-- 6 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue create mode 100644 src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue rename src/renderer/extensions/vueNodes/widgets/components/{WidgetSlider.test.ts => WidgetInputNumberSlider.test.ts} (95%) rename src/renderer/extensions/vueNodes/widgets/components/{WidgetSlider.vue => WidgetInputNumberSlider.vue} (98%) diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue new file mode 100644 index 000000000..45ce81aa1 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue new file mode 100644 index 000000000..6e91171b3 --- /dev/null +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetSlider.test.ts b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.test.ts similarity index 95% rename from src/renderer/extensions/vueNodes/widgets/components/WidgetSlider.test.ts rename to src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.test.ts index 3e554023f..179c342d2 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetSlider.test.ts +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.test.ts @@ -7,9 +7,9 @@ import { describe, expect, it } from 'vitest' import type { SimplifiedWidget } from '@/types/simplifiedWidget' -import WidgetSlider from './WidgetSlider.vue' +import WidgetInputNumberSlider from './WidgetInputNumberSlider.vue' -describe('WidgetSlider Value Binding', () => { +describe('WidgetInputNumberSlider Value Binding', () => { const createMockWidget = ( value: number = 5, options: Partial = {}, @@ -27,7 +27,7 @@ describe('WidgetSlider Value Binding', () => { modelValue: number, readonly = false ) => { - return mount(WidgetSlider, { + return mount(WidgetInputNumberSlider, { global: { plugins: [PrimeVue], components: { InputText, Slider } diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetSlider.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.vue similarity index 98% rename from src/renderer/extensions/vueNodes/widgets/components/WidgetSlider.vue rename to src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.vue index a303b4923..c9894f4b8 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetSlider.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.vue @@ -16,8 +16,6 @@ v-model="inputDisplayValue" :disabled="readonly" type="number" - :min="widget.options?.min" - :max="widget.options?.max" :step="stepValue" class="w-[4em] text-center text-xs px-0 !border-none !shadow-none !bg-transparent" size="small" diff --git a/src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts b/src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts index c8b0b0a49..b07c89e5b 100644 --- a/src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts +++ b/src/renderer/extensions/vueNodes/widgets/registry/widgetRegistry.ts @@ -9,12 +9,12 @@ import WidgetColorPicker from '../components/WidgetColorPicker.vue' import WidgetFileUpload from '../components/WidgetFileUpload.vue' import WidgetGalleria from '../components/WidgetGalleria.vue' import WidgetImageCompare from '../components/WidgetImageCompare.vue' +import WidgetInputNumber from '../components/WidgetInputNumber.vue' import WidgetInputText from '../components/WidgetInputText.vue' import WidgetMarkdown from '../components/WidgetMarkdown.vue' import WidgetMultiSelect from '../components/WidgetMultiSelect.vue' import WidgetSelect from '../components/WidgetSelect.vue' import WidgetSelectButton from '../components/WidgetSelectButton.vue' -import WidgetSlider from '../components/WidgetSlider.vue' import WidgetTextarea from '../components/WidgetTextarea.vue' import WidgetToggleSwitch from '../components/WidgetToggleSwitch.vue' import WidgetTreeSelect from '../components/WidgetTreeSelect.vue' @@ -38,11 +38,11 @@ const coreWidgetDefinitions: Array<[string, WidgetDefinition]> = [ essential: false } ], - ['int', { component: WidgetSlider, aliases: ['INT'], essential: true }], + ['int', { component: WidgetInputNumber, aliases: ['INT'], essential: true }], [ 'float', { - component: WidgetSlider, + component: WidgetInputNumber, aliases: ['FLOAT', 'number', 'slider'], essential: true } diff --git a/tests-ui/tests/renderer/extensions/vueNodes/widgets/composables/useWidgetRenderer.test.ts b/tests-ui/tests/renderer/extensions/vueNodes/widgets/composables/useWidgetRenderer.test.ts index 4a363ebd1..64a8d614c 100644 --- a/tests-ui/tests/renderer/extensions/vueNodes/widgets/composables/useWidgetRenderer.test.ts +++ b/tests-ui/tests/renderer/extensions/vueNodes/widgets/composables/useWidgetRenderer.test.ts @@ -3,10 +3,10 @@ import { describe, expect, it } from 'vitest' import WidgetButton from '@/renderer/extensions/vueNodes/widgets/components/WidgetButton.vue' import WidgetColorPicker from '@/renderer/extensions/vueNodes/widgets/components/WidgetColorPicker.vue' import WidgetFileUpload from '@/renderer/extensions/vueNodes/widgets/components/WidgetFileUpload.vue' +import WidgetInputNumber from '@/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue' import WidgetInputText from '@/renderer/extensions/vueNodes/widgets/components/WidgetInputText.vue' import WidgetMarkdown from '@/renderer/extensions/vueNodes/widgets/components/WidgetMarkdown.vue' import WidgetSelect from '@/renderer/extensions/vueNodes/widgets/components/WidgetSelect.vue' -import WidgetSlider from '@/renderer/extensions/vueNodes/widgets/components/WidgetSlider.vue' import WidgetTextarea from '@/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue' import WidgetToggleSwitch from '@/renderer/extensions/vueNodes/widgets/components/WidgetToggleSwitch.vue' import { @@ -20,15 +20,15 @@ describe('widgetRegistry', () => { // Test number type mappings describe('number types', () => { it('should map int types to slider widget', () => { - expect(getComponent('int')).toBe(WidgetSlider) - expect(getComponent('INT')).toBe(WidgetSlider) + expect(getComponent('int')).toBe(WidgetInputNumber) + expect(getComponent('INT')).toBe(WidgetInputNumber) }) it('should map float types to slider widget', () => { - expect(getComponent('float')).toBe(WidgetSlider) - expect(getComponent('FLOAT')).toBe(WidgetSlider) - expect(getComponent('number')).toBe(WidgetSlider) - expect(getComponent('slider')).toBe(WidgetSlider) + expect(getComponent('float')).toBe(WidgetInputNumber) + expect(getComponent('FLOAT')).toBe(WidgetInputNumber) + expect(getComponent('number')).toBe(WidgetInputNumber) + expect(getComponent('slider')).toBe(WidgetInputNumber) }) })