Skip to content

Commit 9e8be5b

Browse files
authored
Merge pull request #9 from rtucek/fix-initial-value-factory
Evaluate factory function for initial value
2 parents b3b122c + 6df69d2 commit 9e8be5b

File tree

2 files changed

+50
-10
lines changed

2 files changed

+50
-10
lines changed

src/QueryBuilderGroup.vue

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,20 +208,19 @@ export default class QueryBuilderGroup extends Vue implements QueryBuilderGroupI
208208
throw new Error(`"initialValue" of "${selectedRule.identifier}" must not be an object - use a factory function!`);
209209
}
210210
211-
let initialValue: any = null; // null as sensitive default...
212-
if (typeof selectedRule.initialValue === 'function') {
213-
// Use factory function
214-
initialValue = selectedRule.initialValue();
215-
}
216-
211+
let value: any = null; // null as sensitive default...
217212
if (typeof selectedRule.initialValue !== 'undefined') {
218-
// If it exists use the primitive value
219-
({ initialValue } = selectedRule);
213+
// If a valid has been passed along, use it
214+
value = selectedRule.initialValue;
215+
}
216+
if (typeof value === 'function') {
217+
// initialValue is a factory function
218+
value = value();
220219
}
221220
222221
children.push({
223222
identifier: selectedRule.identifier,
224-
value: initialValue,
223+
value,
225224
} as Rule);
226225
227226
this.$emit(

tests/unit/query-builder.spec.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@ import QueryBuilder from '@/QueryBuilder.vue';
44
import App from '../components/App.vue';
55
import QueryBuilderGroup from '@/QueryBuilderGroup.vue';
66
import QueryBuilderRule from '@/QueryBuilderRule.vue';
7+
import { QueryBuilderConfig } from '@/types';
8+
9+
interface QueryBuilderTemplate {
10+
value: any,
11+
config: QueryBuilderConfig,
12+
}
713

814
describe('Test basic functionality of QueryBuilder.vue', () => {
9-
const getTemplate = () => ({
15+
const getTemplate = (): QueryBuilderTemplate => ({
1016
value: null,
1117
config: {
1218
operators: [
@@ -114,6 +120,41 @@ describe('Test basic functionality of QueryBuilder.vue', () => {
114120
});
115121
});
116122

123+
it('makes use of an initial value\'s factory function', () => {
124+
const initialValue = jest.fn(() => 'Hello World');
125+
126+
const data = getTemplate();
127+
data.config.rules = [
128+
{
129+
identifier: 'txt',
130+
name: 'Text Selection',
131+
component: Component,
132+
initialValue,
133+
},
134+
];
135+
136+
const app = mount(App, {
137+
data() {
138+
return data;
139+
},
140+
});
141+
const wrapper = app.find(QueryBuilder);
142+
143+
// Assert rules are available
144+
const rules = wrapper.find('.query-builder-group__group-control select').findAll('option');
145+
const addRuleBtn = wrapper.find('.query-builder-group__rule-adding-button');
146+
147+
// Assert update has propagated with default value
148+
rules.at(1).setSelected();
149+
addRuleBtn.trigger('click');
150+
expect(wrapper.emittedByOrder()).toHaveLength(1);
151+
expect(wrapper.emittedByOrder()[0]).toStrictEqual({
152+
name: 'input',
153+
args: [{ operatorIdentifier: 'and', children: [{ identifier: 'txt', value: 'Hello World' }] }],
154+
});
155+
expect(initialValue).toHaveBeenCalled();
156+
});
157+
117158
it('deletes a rule', () => {
118159
const data = () => ({
119160
query: {

0 commit comments

Comments
 (0)