alchemy-form 0.1.5 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/assets/stylesheets/form/alchemy_field_array.scss +4 -0
- package/assets/stylesheets/form/alchemy_select.scss +1 -3
- package/assets/stylesheets/form/alchemy_toggle.scss +2 -0
- package/assets/stylesheets/form/query_builder.scss +185 -0
- package/config/routes.js +8 -0
- package/controller/form_api_controller.js +43 -4
- package/element/20_query_builder_base.js +82 -0
- package/element/25_query_builder_data.js +139 -0
- package/element/alchemy_field.js +31 -7
- package/element/alchemy_select.js +172 -39
- package/element/alchemy_select_item.js +9 -0
- package/element/alchemy_table.js +172 -26
- package/element/query_builder.js +90 -0
- package/element/query_builder_entry.js +388 -0
- package/element/query_builder_group.js +248 -0
- package/element/query_builder_value.js +316 -0
- package/element/query_builder_variable.js +103 -0
- package/helper/form_actions/00_form_action.js +328 -0
- package/helper/form_actions/url_action.js +69 -0
- package/helper/query_builder_variable_definition/00_variable_definition.js +371 -0
- package/helper/query_builder_variable_definition/boolean_variable_definition.js +24 -0
- package/helper/query_builder_variable_definition/list_variable_definition.js +38 -0
- package/helper/query_builder_variable_definition/number_variable_definition.js +106 -0
- package/helper/query_builder_variable_definition/string_variable_definition.js +46 -0
- package/helper_field/query_builder_assignment.js +11 -0
- package/helper_field/query_builder_field.js +91 -0
- package/helper_field/query_builder_value.js +56 -0
- package/helper_field/query_builder_variable.js +56 -0
- package/package.json +2 -2
- package/view/form/elements/alchemy_field_array.hwk +3 -1
- package/view/form/elements/alchemy_field_array_entry.hwk +3 -1
- package/view/form/elements/alchemy_select_item.hwk +6 -1
- package/view/form/elements/query_builder.hwk +1 -0
- package/view/form/elements/query_builder_entry.hwk +33 -0
- package/view/form/elements/query_builder_group.hwk +64 -0
- package/view/form/elements/query_builder_value.hwk +10 -0
- package/view/form/elements/query_builder_variable.hwk +6 -0
- package/view/form/inputs/edit/belongs_to.hwk +1 -1
- package/view/form/inputs/edit/html.hwk +5 -0
- package/view/form/inputs/edit/query_builder.hwk +5 -0
- package/view/form/inputs/edit/query_builder_assignment.hwk +6 -0
- package/view/form/inputs/edit/query_builder_value.hwk +11 -0
- package/view/form/inputs/edit/query_builder_variable.hwk +10 -0
- package/view/form/inputs/view/string.hwk +1 -0
- package/view/form/inputs/view_inline/string.hwk +1 -0
- package/view/form/select/qb_item.hwk +7 -0
- package/view/form/wrappers/view_inline/default.hwk +1 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The alchemy-toggle custom element
|
|
3
|
+
*
|
|
4
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
5
|
+
* @since 0.1.6
|
|
6
|
+
* @version 0.1.6
|
|
7
|
+
*/
|
|
8
|
+
const QueryBuilder = Function.inherits('Alchemy.Element.Form.Base', 'QueryBuilder');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The template code
|
|
12
|
+
*
|
|
13
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
14
|
+
* @since 0.1.6
|
|
15
|
+
* @version 0.1.6
|
|
16
|
+
*/
|
|
17
|
+
QueryBuilder.setTemplate(`<alchemy-query-builder-group></alchemy-query-builder-group>`, {plain_html: true, render_immediate: true});
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The stylesheet to load for this element
|
|
21
|
+
*
|
|
22
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
23
|
+
* @since 0.1.6
|
|
24
|
+
* @version 0.1.6
|
|
25
|
+
*/
|
|
26
|
+
QueryBuilder.setStylesheetFile('form/query_builder');
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The dataprovider used to get the variables
|
|
30
|
+
*
|
|
31
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
32
|
+
* @since 0.1.6
|
|
33
|
+
* @version 0.1.6
|
|
34
|
+
*/
|
|
35
|
+
QueryBuilder.setAssignedProperty('dataprovider');
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Getter for the header element
|
|
39
|
+
*
|
|
40
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
41
|
+
* @since 0.1.6
|
|
42
|
+
* @version 0.1.6
|
|
43
|
+
*/
|
|
44
|
+
QueryBuilder.addElementGetter('root_group', ':scope > alchemy-query-builder-group');
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Get/set the value
|
|
48
|
+
*
|
|
49
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
50
|
+
* @since 0.1.6
|
|
51
|
+
* @version 0.1.6
|
|
52
|
+
*/
|
|
53
|
+
QueryBuilder.setProperty(function value() {
|
|
54
|
+
return this.root_group.value;
|
|
55
|
+
}, function setValue(value) {
|
|
56
|
+
this.assigned_data.value = value;
|
|
57
|
+
|
|
58
|
+
if (Blast.isBrowser && this.has_rendered) {
|
|
59
|
+
this.applyValue(value);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Apply the given value
|
|
65
|
+
*
|
|
66
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
67
|
+
* @since 0.1.6
|
|
68
|
+
* @version 0.1.6
|
|
69
|
+
*/
|
|
70
|
+
QueryBuilder.setMethod(function applyValue(value) {
|
|
71
|
+
|
|
72
|
+
if (!value) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
this.root_group.value = value;
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Added to the dom
|
|
81
|
+
*
|
|
82
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
83
|
+
* @since 0.1.6
|
|
84
|
+
* @version 0.1.6
|
|
85
|
+
*/
|
|
86
|
+
QueryBuilder.setMethod(function introduced() {
|
|
87
|
+
if (this.assigned_data.value) {
|
|
88
|
+
this.applyValue(this.assigned_data.value);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The query-builder-entry custom element
|
|
3
|
+
*
|
|
4
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
5
|
+
* @since 0.1.6
|
|
6
|
+
* @version 0.1.6
|
|
7
|
+
*/
|
|
8
|
+
const QueryBuilderEntry = Function.inherits('Alchemy.Element.Form.QueryBuilderBase', 'QueryBuilderEntry');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The template to use for the content of this element
|
|
12
|
+
*
|
|
13
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
14
|
+
* @since 0.1.6
|
|
15
|
+
* @version 0.1.6
|
|
16
|
+
*/
|
|
17
|
+
QueryBuilderEntry.setTemplateFile('form/elements/query_builder_entry');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The type of entry
|
|
21
|
+
* (can change the operators used)
|
|
22
|
+
*
|
|
23
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
24
|
+
* @since 0.1.6
|
|
25
|
+
* @version 0.1.6
|
|
26
|
+
*/
|
|
27
|
+
QueryBuilderEntry.setAttribute('type');
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Getter for the field selector
|
|
31
|
+
*
|
|
32
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
33
|
+
* @since 0.1.6
|
|
34
|
+
* @version 0.1.6
|
|
35
|
+
*/
|
|
36
|
+
QueryBuilderEntry.addElementGetter('field_select', '.qb-field');
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Getter for the operator selector
|
|
40
|
+
*
|
|
41
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
42
|
+
* @since 0.1.6
|
|
43
|
+
* @version 0.1.6
|
|
44
|
+
*/
|
|
45
|
+
QueryBuilderEntry.addElementGetter('operator_select', '.qb-operator');
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Getter for the value type selector
|
|
49
|
+
* (variable, value)
|
|
50
|
+
*
|
|
51
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
52
|
+
* @since 0.1.6
|
|
53
|
+
* @version 0.1.6
|
|
54
|
+
*/
|
|
55
|
+
QueryBuilderEntry.addElementGetter('value_type_select', '.qb-value-type');
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Getter for the value input wrapper
|
|
59
|
+
*
|
|
60
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
61
|
+
* @since 0.1.6
|
|
62
|
+
* @version 0.1.6
|
|
63
|
+
*/
|
|
64
|
+
QueryBuilderEntry.addElementGetter('value_input_wrapper', '.qb-value-input-wrapper');
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Getter for the delete button
|
|
68
|
+
*
|
|
69
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
70
|
+
* @since 0.1.6
|
|
71
|
+
* @version 0.1.6
|
|
72
|
+
*/
|
|
73
|
+
QueryBuilderEntry.addElementGetter('delete_button', '.qb-delete-entry');
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Get/set the value
|
|
77
|
+
*
|
|
78
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
79
|
+
* @since 0.1.6
|
|
80
|
+
* @version 0.1.6
|
|
81
|
+
*/
|
|
82
|
+
QueryBuilderEntry.setProperty(function value() {
|
|
83
|
+
|
|
84
|
+
if (!this.field_select.value) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
let result = {
|
|
89
|
+
type : 'qb_entry',
|
|
90
|
+
field : this.field_select.value,
|
|
91
|
+
operator : this.operator_select.value,
|
|
92
|
+
source_type : this.value_type_select.value,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
if (result.source_type == 'variable') {
|
|
96
|
+
let select = this.value_input_wrapper.querySelector('.qb-value-variable');
|
|
97
|
+
|
|
98
|
+
if (select) {
|
|
99
|
+
result.value_variable = select.value;
|
|
100
|
+
}
|
|
101
|
+
} else if (result.source_type == 'value') {
|
|
102
|
+
let input = this.value_input_wrapper.querySelector('.qb-value-input');
|
|
103
|
+
|
|
104
|
+
if (input) {
|
|
105
|
+
let value_explicit = {
|
|
106
|
+
type : this.getValueType(input),
|
|
107
|
+
value : null,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
if (value_explicit.type == 'number' && typeof input.valueAsNumber != 'undefined') {
|
|
111
|
+
value_explicit.value = input.valueAsNumber;
|
|
112
|
+
} else {
|
|
113
|
+
value_explicit.value = input.value;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
result.value_explicit = value_explicit;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return result;
|
|
121
|
+
}, function setValue(value) {
|
|
122
|
+
this.assigned_data.value = value;
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Load data for a specific element
|
|
127
|
+
*
|
|
128
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
129
|
+
* @since 0.1.6
|
|
130
|
+
* @version 0.1.6
|
|
131
|
+
*/
|
|
132
|
+
QueryBuilderEntry.setMethod(async function loadData(config, element) {
|
|
133
|
+
|
|
134
|
+
if (!element) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (!config) {
|
|
139
|
+
config = {};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let items;
|
|
143
|
+
|
|
144
|
+
if (element.classList.contains('qb-field') || element.classList.contains('qb-value-variable')) {
|
|
145
|
+
items = await this.loadVariableData(config);
|
|
146
|
+
} else if (element.classList.contains('qb-operator')) {
|
|
147
|
+
items = await this.loadOperatorData(config);
|
|
148
|
+
} else if (element.classList.contains('qb-value-type')) {
|
|
149
|
+
items = await this.loadValueTypeData(config);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
console.log('Got items:', items);
|
|
153
|
+
items.clean(null);
|
|
154
|
+
items.clean(undefined);
|
|
155
|
+
items.clean(false);
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
items: items,
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Load value type data
|
|
164
|
+
*
|
|
165
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
166
|
+
* @since 0.1.6
|
|
167
|
+
* @version 0.1.6
|
|
168
|
+
*/
|
|
169
|
+
QueryBuilderEntry.setMethod(async function loadValueTypeData(config) {
|
|
170
|
+
|
|
171
|
+
let items = [];
|
|
172
|
+
|
|
173
|
+
items.push({id: 'variable', title: 'Other variable'});
|
|
174
|
+
items.push({id: 'value', title: 'Value'});
|
|
175
|
+
|
|
176
|
+
return items;
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Load variable data
|
|
181
|
+
*
|
|
182
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
183
|
+
* @since 0.1.6
|
|
184
|
+
* @version 0.1.6
|
|
185
|
+
*/
|
|
186
|
+
QueryBuilderEntry.setMethod(async function loadVariableData(config) {
|
|
187
|
+
|
|
188
|
+
config.value_type = 'variable';
|
|
189
|
+
|
|
190
|
+
let dataprovider = this.dataprovider;
|
|
191
|
+
|
|
192
|
+
if (!config) {
|
|
193
|
+
config = {};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
config.type = this.type || 'logical';
|
|
197
|
+
|
|
198
|
+
let variables = [];
|
|
199
|
+
|
|
200
|
+
if (dataprovider) {
|
|
201
|
+
variables = await dataprovider.loadData(config, this);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
let result = [];
|
|
205
|
+
|
|
206
|
+
if (variables && variables.length) {
|
|
207
|
+
let allow_readonly = true,
|
|
208
|
+
entry;
|
|
209
|
+
|
|
210
|
+
if (config.type != 'logical') {
|
|
211
|
+
allow_readonly = false;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
for (entry of variables) {
|
|
215
|
+
if (entry) {
|
|
216
|
+
if (allow_readonly || !entry.readonly) {
|
|
217
|
+
result.push(entry);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Example
|
|
224
|
+
// items.push({
|
|
225
|
+
// id : 'id',
|
|
226
|
+
// title : 'ID',
|
|
227
|
+
// type : 'number'
|
|
228
|
+
// });
|
|
229
|
+
|
|
230
|
+
return result;
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Load operator data
|
|
235
|
+
*
|
|
236
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
237
|
+
* @since 0.1.6
|
|
238
|
+
* @version 0.1.6
|
|
239
|
+
*/
|
|
240
|
+
QueryBuilderEntry.setMethod(async function loadOperatorData(config) {
|
|
241
|
+
|
|
242
|
+
let type = this.field_select.value;
|
|
243
|
+
|
|
244
|
+
if (!type) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
let variable_def = this.field_select.getValueData(type);
|
|
249
|
+
|
|
250
|
+
let items = [];
|
|
251
|
+
|
|
252
|
+
if (variable_def) {
|
|
253
|
+
|
|
254
|
+
if (!this.type || this.type == 'logical') {
|
|
255
|
+
items.include(variable_def.getLogicalOperators());
|
|
256
|
+
} else if (this.type == 'assignment') {
|
|
257
|
+
items.include(variable_def.getAssignmentOperators());
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return items;
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Show the correct value input
|
|
266
|
+
*
|
|
267
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
268
|
+
* @since 0.1.6
|
|
269
|
+
* @version 0.1.6
|
|
270
|
+
*/
|
|
271
|
+
QueryBuilderEntry.setMethod(async function showValueInput() {
|
|
272
|
+
|
|
273
|
+
let variable_name = this.field_select.value;
|
|
274
|
+
|
|
275
|
+
if (!variable_name) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
let entry = this.field_select.getValueData(variable_name);
|
|
280
|
+
|
|
281
|
+
if (!entry) {
|
|
282
|
+
await this.field_select.waitForTasks();
|
|
283
|
+
|
|
284
|
+
entry = this.field_select.getValueData(variable_name);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (!entry) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
let element = entry.createValueInput(this.hawkejs_renderer);
|
|
292
|
+
|
|
293
|
+
element.classList.add('qb-value-input');
|
|
294
|
+
|
|
295
|
+
this.value_input_wrapper.append(element);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Apply the given value
|
|
300
|
+
*
|
|
301
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
302
|
+
* @since 0.1.6
|
|
303
|
+
* @version 0.1.6
|
|
304
|
+
*/
|
|
305
|
+
QueryBuilderEntry.setMethod(async function applyValue(value) {
|
|
306
|
+
|
|
307
|
+
if (!value) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
this.field_select.value = value.field;
|
|
312
|
+
this.operator_select.value = value.operator;
|
|
313
|
+
this.value_type_select.value = value.source_type;
|
|
314
|
+
|
|
315
|
+
await this.applyValueTypeChanges();
|
|
316
|
+
|
|
317
|
+
if (value.source_type == 'variable') {
|
|
318
|
+
let select = this.value_input_wrapper.querySelector('.qb-value-variable');
|
|
319
|
+
|
|
320
|
+
if (select) {
|
|
321
|
+
select.value = value.value_variable;
|
|
322
|
+
}
|
|
323
|
+
} else if (value.source_type == 'value') {
|
|
324
|
+
let input = this.value_input_wrapper.querySelector('.qb-value-input');
|
|
325
|
+
|
|
326
|
+
if (input && value.value_explicit) {
|
|
327
|
+
input.value = value.value_explicit.value;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Apply value type changes
|
|
334
|
+
*
|
|
335
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
336
|
+
* @since 0.1.6
|
|
337
|
+
* @version 0.1.6
|
|
338
|
+
*/
|
|
339
|
+
QueryBuilderEntry.setMethod(async function applyValueTypeChanges() {
|
|
340
|
+
|
|
341
|
+
Hawkejs.removeChildren(this.value_input_wrapper);
|
|
342
|
+
|
|
343
|
+
let type = this.value_type_select.value;
|
|
344
|
+
|
|
345
|
+
if (type == 'variable') {
|
|
346
|
+
let select = this.createElement('alchemy-select');
|
|
347
|
+
select.value_item_template = 'form/select/qb_item';
|
|
348
|
+
select.option_item_template = 'form/select/qb_item';
|
|
349
|
+
|
|
350
|
+
select.dataprovider = this;
|
|
351
|
+
select.classList.add('qb-value-variable');
|
|
352
|
+
this.value_input_wrapper.append(select);
|
|
353
|
+
} else if (type == 'value') {
|
|
354
|
+
await this.showValueInput();
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Added to the dom
|
|
360
|
+
*
|
|
361
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
362
|
+
* @since 0.1.6
|
|
363
|
+
* @version 0.1.6
|
|
364
|
+
*/
|
|
365
|
+
QueryBuilderEntry.setMethod(function introduced() {
|
|
366
|
+
|
|
367
|
+
this.field_select.addEventListener('change', e => {
|
|
368
|
+
e.preventDefault();
|
|
369
|
+
|
|
370
|
+
this.operator_select.value = null;
|
|
371
|
+
this.value_type_select.value = null;
|
|
372
|
+
Hawkejs.removeChildren(this.value_input_wrapper);
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
this.delete_button.addEventListener('click', e => {
|
|
376
|
+
e.preventDefault();
|
|
377
|
+
this.remove();
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
this.value_type_select.addEventListener('change', e => {
|
|
381
|
+
e.preventDefault();
|
|
382
|
+
this.applyValueTypeChanges();
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
if (this.assigned_data.value) {
|
|
386
|
+
this.applyValue(this.assigned_data.value);
|
|
387
|
+
}
|
|
388
|
+
});
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The alchemy-toggle custom element
|
|
3
|
+
*
|
|
4
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
5
|
+
* @since 0.1.6
|
|
6
|
+
* @version 0.1.6
|
|
7
|
+
*/
|
|
8
|
+
const QueryBuilderGroup = Function.inherits('Alchemy.Element.Form.QueryBuilderBase', 'QueryBuilderGroup');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The template to use for the content of this element
|
|
12
|
+
*
|
|
13
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
14
|
+
* @since 0.1.0
|
|
15
|
+
* @version 0.1.0
|
|
16
|
+
*/
|
|
17
|
+
QueryBuilderGroup.setTemplateFile('form/elements/query_builder_group');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Should the result be inverted?
|
|
21
|
+
*
|
|
22
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
23
|
+
* @since 0.1.6
|
|
24
|
+
* @version 0.1.6
|
|
25
|
+
*/
|
|
26
|
+
QueryBuilderGroup.setAttribute('not', {boolean: true});
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Is this the root group?
|
|
30
|
+
*
|
|
31
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
32
|
+
* @since 0.1.6
|
|
33
|
+
* @version 0.1.6
|
|
34
|
+
*/
|
|
35
|
+
QueryBuilderGroup.setProperty(function is_root_group() {
|
|
36
|
+
return (this.root_query_builder == this.parentElement);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Getter for the header element
|
|
41
|
+
*
|
|
42
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
43
|
+
* @since 0.1.6
|
|
44
|
+
* @version 0.1.6
|
|
45
|
+
*/
|
|
46
|
+
QueryBuilderGroup.addElementGetter('header', ':scope > .qb-group-header');
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Getter for the body element
|
|
50
|
+
*
|
|
51
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
52
|
+
* @since 0.1.6
|
|
53
|
+
* @version 0.1.6
|
|
54
|
+
*/
|
|
55
|
+
QueryBuilderGroup.addElementGetter('body', ':scope > .qb-group-body');
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Getter for the body element
|
|
59
|
+
*
|
|
60
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
61
|
+
* @since 0.1.6
|
|
62
|
+
* @version 0.1.6
|
|
63
|
+
*/
|
|
64
|
+
QueryBuilderGroup.addElementGetter('rules_list', ':scope > .qb-group-body > .qb-rules-list');
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Get the group type
|
|
68
|
+
*
|
|
69
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
70
|
+
* @since 0.1.6
|
|
71
|
+
* @version 0.1.6
|
|
72
|
+
*/
|
|
73
|
+
QueryBuilderGroup.setProperty(function group_type() {
|
|
74
|
+
|
|
75
|
+
let input = this.header.querySelector('.qb-group-type input:checked'),
|
|
76
|
+
result;
|
|
77
|
+
|
|
78
|
+
if (input) {
|
|
79
|
+
result = input.value;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (!result) {
|
|
83
|
+
result = 'and';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return result;
|
|
87
|
+
}, function setType(value) {
|
|
88
|
+
|
|
89
|
+
if (!value) {
|
|
90
|
+
value = 'and';
|
|
91
|
+
} else {
|
|
92
|
+
value = String(value).toLowerCase();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
let input = this.header.querySelector('.qb-group-type input[value="' + value + '"]');
|
|
96
|
+
|
|
97
|
+
if (input) {
|
|
98
|
+
input.checked = true;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Is this group inverted/not?
|
|
104
|
+
*
|
|
105
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
106
|
+
* @since 0.1.6
|
|
107
|
+
* @version 0.1.7
|
|
108
|
+
*/
|
|
109
|
+
QueryBuilderGroup.setProperty(function inverted() {
|
|
110
|
+
|
|
111
|
+
let input = this.header.querySelector('.qb-group-invert input:checked');
|
|
112
|
+
|
|
113
|
+
if (input) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return false;
|
|
118
|
+
}, function setInverted(value) {
|
|
119
|
+
|
|
120
|
+
if (!this.assigned_data.value) {
|
|
121
|
+
this.assigned_data.value = {};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
this.assigned_data.value.inverted = value;
|
|
125
|
+
|
|
126
|
+
if (this.header) {
|
|
127
|
+
let input = this.header.querySelector('.qb-group-invert input');
|
|
128
|
+
input.checked = value;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Get/set the value
|
|
134
|
+
*
|
|
135
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
136
|
+
* @since 0.1.6
|
|
137
|
+
* @version 0.1.7
|
|
138
|
+
*/
|
|
139
|
+
QueryBuilderGroup.setProperty(function value() {
|
|
140
|
+
|
|
141
|
+
let result = {
|
|
142
|
+
type : 'group',
|
|
143
|
+
condition : this.group_type,
|
|
144
|
+
inverted : this.inverted,
|
|
145
|
+
rules : [],
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
let rules_elements = this.rules_list.children;
|
|
149
|
+
|
|
150
|
+
for (let i = 0; i < rules_elements.length; i++) {
|
|
151
|
+
let element = rules_elements[i],
|
|
152
|
+
value = element.value;
|
|
153
|
+
|
|
154
|
+
if (value) {
|
|
155
|
+
result.rules.push(element.value);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return result;
|
|
160
|
+
}, function setValue(value) {
|
|
161
|
+
|
|
162
|
+
this.assigned_data.value = value;
|
|
163
|
+
|
|
164
|
+
if (this.has_rendered) {
|
|
165
|
+
this.applyValue(value);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Apply the given value
|
|
171
|
+
*
|
|
172
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
173
|
+
* @since 0.1.6
|
|
174
|
+
* @version 0.1.7
|
|
175
|
+
*/
|
|
176
|
+
QueryBuilderGroup.setMethod(function applyValue(value) {
|
|
177
|
+
|
|
178
|
+
if (!value) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Keep track of how many time a value has been applied
|
|
183
|
+
// (needed for the initial value setter)
|
|
184
|
+
if (!this.applied_value_counter) {
|
|
185
|
+
this.applied_value_counter = 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
this.applied_value_counter++;
|
|
189
|
+
|
|
190
|
+
this.inverted = value.inverted;
|
|
191
|
+
this.group_type = value.condition;
|
|
192
|
+
|
|
193
|
+
Hawkejs.removeChildren(this.rules_list);
|
|
194
|
+
|
|
195
|
+
if (value.rules && value.rules.length) {
|
|
196
|
+
let element,
|
|
197
|
+
rule;
|
|
198
|
+
|
|
199
|
+
for (rule of value.rules) {
|
|
200
|
+
if (rule.type == 'qb_entry') {
|
|
201
|
+
element = this.createElement('alchemy-query-builder-entry');
|
|
202
|
+
} else {
|
|
203
|
+
element = this.createElement('alchemy-query-builder-group');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
element.assigned_data.value = rule;
|
|
207
|
+
this.rules_list.append(element);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Added to the dom
|
|
214
|
+
*
|
|
215
|
+
* @author Jelle De Loecker <jelle@elevenways.be>
|
|
216
|
+
* @since 0.1.6
|
|
217
|
+
* @version 0.1.7
|
|
218
|
+
*/
|
|
219
|
+
QueryBuilderGroup.setMethod(function introduced() {
|
|
220
|
+
|
|
221
|
+
let add_rule = this.header.querySelector('.qb-add-rule'),
|
|
222
|
+
add_group = this.header.querySelector('.qb-add-group'),
|
|
223
|
+
delete_group = this.header.querySelector('.qb-delete-group');
|
|
224
|
+
|
|
225
|
+
add_rule.addEventListener('click', e => {
|
|
226
|
+
e.preventDefault();
|
|
227
|
+
|
|
228
|
+
let new_rule = this.createElement('alchemy-query-builder-entry');
|
|
229
|
+
this.rules_list.append(new_rule);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
add_group.addEventListener('click', e => {
|
|
233
|
+
e.preventDefault();
|
|
234
|
+
|
|
235
|
+
let new_group = this.createElement('alchemy-query-builder-group');
|
|
236
|
+
this.rules_list.append(new_group);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
delete_group.addEventListener('click', e => {
|
|
240
|
+
e.preventDefault();
|
|
241
|
+
this.remove();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// Apply the value if it hasn't been done already
|
|
245
|
+
if (this.assigned_data.value && !this.applied_value_counter) {
|
|
246
|
+
this.applyValue(this.assigned_data.value);
|
|
247
|
+
}
|
|
248
|
+
});
|