Skip to content

Commit

Permalink
Release 5.8.12
Browse files Browse the repository at this point in the history
### Changelog:
* Fix(frontend): Fixed dynamic field value reset.

See merge request vst/vst-utils!613
  • Loading branch information
onegreyonewhite committed Nov 14, 2023
2 parents 2ef78d1 + c5ad990 commit f4aee32
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 9 deletions.
21 changes: 13 additions & 8 deletions frontend_src/vstutils/fields/dynamic/DynamicFieldMixin.vue
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,20 @@
}
watch(parentValues, (newValues, oldValues) => {
if (!deepEqual(newValues, oldValues)) {
realField.value = props.field.getRealField(newValues);
setValue({
field: props.field.name,
value: savedValues.has(realField.value)
? savedValues.get(realField.value)
: realField.value.getInitialValue(),
});
if (deepEqual(newValues, oldValues)) {
return;
}
const newField = props.field.getRealField(newValues);
if (newField.isEqual(realField.value)) {
return;
}
realField.value = newField;
setValue({
field: props.field.name,
value: savedValues.has(realField.value)
? savedValues.get(realField.value)
: realField.value.getInitialValue(),
});
});
return { realField, setValue };
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { beforeAll, describe, expect, test, jest } from '@jest/globals';
import { StringField } from '@/vstutils/fields/text';
import { DynamicField } from '../DynamicField';
import { createApp } from '@/unittests';
import VueI18n from 'vue-i18n';
import { nextTick, reactive } from 'vue';
import { mount } from '@vue/test-utils';

let app: Awaited<ReturnType<typeof createApp>>;

beforeAll(async () => {
app = await createApp();
});

describe('DynamicField', () => {
test('real field with same structure will not trigger value reset', async () => {
const field = new DynamicField({
name: 'field',
type: 'string',
'x-options': {
field: ['someField'],
types: {},
},
});

// Override getRealField to return field of same type but different instance
field.getRealField = function getRealField() {
return new StringField({
name: 'field',
type: 'string',
});
};

const data = reactive({ someField: 'val 1', field: 'initial value' });
const setValue = jest.fn();
const wrapper = mount(
{
template: `<Field :field="field" :data="data" type="readonly" @set-value="setValue" />`,
components: { Field: field.getComponent() },
setup() {
return {
field,
data: data,
setValue,
};
},
},
{ localVue: app.vue, i18n: new VueI18n() },
);

expect(wrapper.html()).toMatch(/initial value/);
expect(setValue).toBeCalledTimes(0);
data.someField = 'val 2';
await nextTick();
expect(wrapper.html()).toMatch(/initial value/);
expect(setValue).toBeCalledTimes(0);
});
});
2 changes: 1 addition & 1 deletion vstutils/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# pylint: disable=django-not-available
__version__: str = '5.8.11'
__version__: str = '5.8.12'

0 comments on commit f4aee32

Please sign in to comment.