-
Notifications
You must be signed in to change notification settings - Fork 7
/
DefaultBuilder.vue
105 lines (104 loc) · 3.59 KB
/
DefaultBuilder.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<template>
<div class="vrb-container">
<div>
<select v-if="filter.rules.length > 1" class="vrb-select" :value="filter.all" data-test="allSelector" @change="changeGroupType(filter.id, JSON.parse($event.target.value))">
<option :value="true">All of these rules are true</option>
<option :value="false">Any of these rules are true</option>
</select>
</div>
<div v-for="(rule, i) of filter.rules" :key="i" class="vrb-row">
<Builder
v-if="typeof rule.all !== 'undefined'"
:fields="fields"
:filter="rule"
:parent="filter"
class="vrb-nested"
/>
<div v-else class="vrb-row">
<button class="vrb-btn vrb-btn__remove" v-if="filter.rules.length > 1 || filter.id !== 'root'" data-test="removeRule" @click="removeRule(filter.id, rule.id)">x</button>
<select :value="rule.field" @change="setField(rule.id, getField(value($event)))" data-test="fieldSelector" class="vrb-select">
<option :value="null">Field</option>
<option v-for="(field, j) of fields" :key="j" :value="field.name">
{{field.label}}
</option>
</select>
<select :value="rule.operation" v-if="rule.field && operationsForField(rule.field)" data-test="operationSelector" @change="setOperation(rule.id, value($event))" class="vrb-select">
<option :value="null">Operation</option>
<option v-for="({label, value}) of operationsForField(rule.field)" :value="value" :key="value">
{{label}}
</option>
</select>
<template v-if="rule.operation && !unary(rule.field, rule.operation)">
<component
data-test="valueSetter"
v-if="componentForRule(rule)"
:is="componentForRule(rule)"
class="vrb-custom"
:value="rule.value"
:rule="rule"
@change="setValue(rule.id, $event)"></component>
<input
data-test="valueSetter"
class="vrb-input"
v-else
:value="rule.value"
:rule="rule"
@change="setValue(rule.id, $event.target.value)"
/>
</template>
<div v-if="rule.field && isFilterable(rule.field)" data-test="fieldFilter" class="vrb-row">
<span v-if="rule.filter.rules.length === 0" @click="addRule(rule.filter.id)" class="vrb-filter-further">
+ Filter Further
</span>
<Builder class="vrb-nested"
v-else
:fields="getField(rule.field).fields"
:filter="rule.filter"
:parent="rule"
/>
</div>
</div>
</div>
<button class="vrb-btn" data-test="addRule" @click="addRule(filter.id)">Add Rule</button>
<button class="vrb-btn" data-test="addGroup" @click="addGroup(filter.id)">Add Group</button>
<button class="vrb-btn vrb-btn__remove-group" v-if="filter.id !== 'root' && !subfilter" @click="removeRule(filter.id)" data-test="removeGroup">Remove Group</button>
</div>
</template>
<script>
const DefaultBuilder = {
name: "DefaultBuilder",
props: [
"filter",
"fields",
"subfilter",
"componentForRule",
"operationsForField",
"getField"
],
inject: [
"addRule",
"removeRule",
"addGroup",
"changeGroupType",
"setField",
"setOperation",
"setValue"
],
created() {
const Builder = require("./Builder");
this.$options.components.Builder = Builder.default || Builder;
},
methods: {
unary (field, operation) {
return this.operationsForField(field).find(x => x.value === operation).unary
},
value(e) {
return e.target.value;
},
isFilterable(field) {
return this.getField(field).filterable;
}
}
};
export default DefaultBuilder;
</script>