Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions src/QueryBuilderGroup.vue
Original file line number Diff line number Diff line change
Expand Up @@ -208,20 +208,19 @@ export default class QueryBuilderGroup extends Vue implements QueryBuilderGroupI
throw new Error(`"initialValue" of "${selectedRule.identifier}" must not be an object - use a factory function!`);
}

let initialValue: any = null; // null as sensitive default...
if (typeof selectedRule.initialValue === 'function') {
// Use factory function
initialValue = selectedRule.initialValue();
}

let value: any = null; // null as sensitive default...
if (typeof selectedRule.initialValue !== 'undefined') {
// If it exists use the primitive value
({ initialValue } = selectedRule);
// If a valid has been passed along, use it
value = selectedRule.initialValue;
}
if (typeof value === 'function') {
// initialValue is a factory function
value = value();
}

children.push({
identifier: selectedRule.identifier,
value: initialValue,
value,
} as Rule);

this.$emit(
Expand Down
43 changes: 42 additions & 1 deletion tests/unit/query-builder.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@ import QueryBuilder from '@/QueryBuilder.vue';
import App from '../components/App.vue';
import QueryBuilderGroup from '@/QueryBuilderGroup.vue';
import QueryBuilderRule from '@/QueryBuilderRule.vue';
import { QueryBuilderConfig } from '@/types';

interface QueryBuilderTemplate {
value: any,
config: QueryBuilderConfig,
}

describe('Test basic functionality of QueryBuilder.vue', () => {
const getTemplate = () => ({
const getTemplate = (): QueryBuilderTemplate => ({
value: null,
config: {
operators: [
Expand Down Expand Up @@ -114,6 +120,41 @@ describe('Test basic functionality of QueryBuilder.vue', () => {
});
});

it('makes use of an initial value\'s factory function', () => {
const initialValue = jest.fn(() => 'Hello World');

const data = getTemplate();
data.config.rules = [
{
identifier: 'txt',
name: 'Text Selection',
component: Component,
initialValue,
},
];

const app = mount(App, {
data() {
return data;
},
});
const wrapper = app.find(QueryBuilder);

// Assert rules are available
const rules = wrapper.find('.query-builder-group__group-control select').findAll('option');
const addRuleBtn = wrapper.find('.query-builder-group__rule-adding-button');

// Assert update has propagated with default value
rules.at(1).setSelected();
addRuleBtn.trigger('click');
expect(wrapper.emittedByOrder()).toHaveLength(1);
expect(wrapper.emittedByOrder()[0]).toStrictEqual({
name: 'input',
args: [{ operatorIdentifier: 'and', children: [{ identifier: 'txt', value: 'Hello World' }] }],
});
expect(initialValue).toHaveBeenCalled();
});

it('deletes a rule', () => {
const data = () => ({
query: {
Expand Down