alchemy-form 0.2.5 → 0.2.6

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.
Files changed (121) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +0 -0
  3. package/assets/stylesheets/form/alchemy_form.scss +0 -0
  4. package/assets/stylesheets/form/elements/_button.scss +0 -0
  5. package/assets/stylesheets/form/elements/_code_input.scss +0 -0
  6. package/assets/stylesheets/form/elements/_feedback_input.scss +0 -0
  7. package/assets/stylesheets/form/elements/_field.scss +0 -0
  8. package/assets/stylesheets/form/elements/_field_array.scss +0 -0
  9. package/assets/stylesheets/form/elements/_field_translatable.scss +0 -0
  10. package/assets/stylesheets/form/elements/_form.scss +0 -0
  11. package/assets/stylesheets/form/elements/_pager.scss +0 -0
  12. package/assets/stylesheets/form/elements/_pathway.scss +56 -0
  13. package/assets/stylesheets/form/elements/_query_builder.scss +0 -0
  14. package/assets/stylesheets/form/elements/_select.scss +0 -0
  15. package/assets/stylesheets/form/elements/_state.scss +0 -0
  16. package/assets/stylesheets/form/elements/_table.scss +0 -0
  17. package/assets/stylesheets/form/elements/_tabs.scss +0 -0
  18. package/assets/stylesheets/form/elements/_toggle.scss +0 -0
  19. package/assets/stylesheets/form/elements/index.scss +2 -1
  20. package/assets/stylesheets/form/general/_colors.scss +0 -0
  21. package/assets/stylesheets/form/general/_textsizes.scss +0 -0
  22. package/assets/stylesheets/form/general/index.scss +0 -0
  23. package/config/routes.js +0 -0
  24. package/controller/form_api_controller.js +0 -0
  25. package/element/10_alchemy_field_custom.js +0 -0
  26. package/element/10_dataprovider.js +0 -0
  27. package/element/15_alchemy_field_entry.js +0 -0
  28. package/element/20_query_builder_base.js +0 -0
  29. package/element/25_query_builder_data.js +0 -2
  30. package/element/30_tab_base.js +0 -0
  31. package/element/40_stateful.js +0 -0
  32. package/element/al_button.js +0 -0
  33. package/element/al_code_input.js +0 -0
  34. package/element/al_field_array.js +0 -0
  35. package/element/al_field_array_entry.js +0 -0
  36. package/element/al_field_schema.js +14 -1
  37. package/element/al_field_translatable.js +0 -0
  38. package/element/al_field_translatable_entry.js +0 -0
  39. package/element/al_label.js +0 -0
  40. package/element/al_number_input.js +0 -0
  41. package/element/al_pager.js +0 -0
  42. package/element/al_password_input.js +0 -0
  43. package/element/al_pathway.js +82 -0
  44. package/element/al_pathway_selection.js +690 -0
  45. package/element/al_query_builder.js +0 -0
  46. package/element/al_query_builder_entry.js +18 -3
  47. package/element/al_query_builder_group.js +0 -0
  48. package/element/al_query_builder_value.js +0 -0
  49. package/element/al_query_builder_variable.js +0 -0
  50. package/element/al_select.js +6 -2
  51. package/element/al_select_item.js +0 -0
  52. package/element/al_state.js +0 -0
  53. package/element/al_tab_button.js +0 -0
  54. package/element/al_tab_context.js +0 -0
  55. package/element/al_tab_list.js +0 -0
  56. package/element/al_tab_panel.js +0 -0
  57. package/element/al_table.js +0 -0
  58. package/element/al_toggle.js +0 -0
  59. package/helper/form_actions/00_form_action.js +0 -0
  60. package/helper/form_actions/url_action.js +0 -0
  61. package/helper/pathway/leaf.js +174 -0
  62. package/helper/query_builder_ns.js +0 -0
  63. package/helper/query_builder_variable_definition/00_variable_definition.js +0 -0
  64. package/helper/query_builder_variable_definition/boolean_variable_definition.js +0 -0
  65. package/helper/query_builder_variable_definition/list_variable_definition.js +0 -0
  66. package/helper/query_builder_variable_definition/number_variable_definition.js +0 -0
  67. package/helper/query_builder_variable_definition/string_variable_definition.js +0 -0
  68. package/helper_field/query_builder_assignment.js +0 -0
  69. package/helper_field/query_builder_field.js +0 -0
  70. package/helper_field/query_builder_value.js +0 -0
  71. package/helper_field/query_builder_variable.js +0 -0
  72. package/package.json +2 -2
  73. package/view/form/elements/al_pathway.hwk +5 -0
  74. package/view/form/elements/al_pathway_selection.hwk +10 -0
  75. package/view/form/elements/alchemy_button.hwk +0 -0
  76. package/view/form/elements/alchemy_field_array.hwk +0 -0
  77. package/view/form/elements/alchemy_field_array_entry.hwk +0 -0
  78. package/view/form/elements/alchemy_field_schema.hwk +0 -0
  79. package/view/form/elements/alchemy_field_translatable.hwk +0 -0
  80. package/view/form/elements/alchemy_field_translatable_entry.hwk +0 -0
  81. package/view/form/elements/alchemy_select.hwk +0 -0
  82. package/view/form/elements/alchemy_select_item.hwk +0 -0
  83. package/view/form/elements/alchemy_toggle.hwk +0 -0
  84. package/view/form/elements/code_input.hwk +0 -0
  85. package/view/form/elements/number_input.hwk +0 -0
  86. package/view/form/elements/password_input.hwk +0 -0
  87. package/view/form/elements/query_builder.hwk +0 -0
  88. package/view/form/elements/query_builder_entry.hwk +0 -0
  89. package/view/form/elements/query_builder_group.hwk +0 -0
  90. package/view/form/elements/query_builder_value.hwk +0 -0
  91. package/view/form/elements/query_builder_variable.hwk +0 -0
  92. package/view/form/inputs/edit/belongs_to.hwk +0 -0
  93. package/view/form/inputs/edit/boolean.hwk +0 -0
  94. package/view/form/inputs/edit/date.hwk +0 -0
  95. package/view/form/inputs/edit/datetime.hwk +0 -0
  96. package/view/form/inputs/edit/enum.hwk +0 -0
  97. package/view/form/inputs/edit/has_and_belongs_to_many.hwk +0 -0
  98. package/view/form/inputs/edit/has_one_parent.hwk +0 -0
  99. package/view/form/inputs/edit/html.hwk +0 -0
  100. package/view/form/inputs/edit/number.hwk +0 -0
  101. package/view/form/inputs/edit/query_builder.hwk +0 -0
  102. package/view/form/inputs/edit/query_builder_assignment.hwk +0 -0
  103. package/view/form/inputs/edit/query_builder_value.hwk +0 -0
  104. package/view/form/inputs/edit/query_builder_variable.hwk +0 -0
  105. package/view/form/inputs/edit/schema.hwk +0 -0
  106. package/view/form/inputs/edit/sourcecode.hwk +0 -0
  107. package/view/form/inputs/edit/string.hwk +0 -0
  108. package/view/form/inputs/edit/text.hwk +0 -0
  109. package/view/form/inputs/edit_inline/boolean.hwk +0 -0
  110. package/view/form/inputs/view/datetime.hwk +0 -0
  111. package/view/form/inputs/view/string.hwk +0 -0
  112. package/view/form/inputs/view_inline/boolean.hwk +0 -0
  113. package/view/form/inputs/view_inline/date.hwk +0 -0
  114. package/view/form/inputs/view_inline/datetime.hwk +0 -0
  115. package/view/form/inputs/view_inline/enum.hwk +0 -0
  116. package/view/form/inputs/view_inline/objectid.hwk +0 -0
  117. package/view/form/inputs/view_inline/string.hwk +0 -0
  118. package/view/form/select/qb_item.hwk +0 -0
  119. package/view/form/wrappers/default/default.hwk +0 -0
  120. package/view/form/wrappers/edit_inline/default.hwk +0 -0
  121. package/view/form/wrappers/view_inline/default.hwk +0 -0
@@ -0,0 +1,690 @@
1
+ const LEAF_DROPDOWN = 'al-pathway-leaf-dropdown';
2
+ const LEAF_TYPE_SELECT = 'al-pathway-select-leaf-type';
3
+ const LEAF_TYPE_ITEM = 'al-pathway-select-leaf-type-item';
4
+ const LEAF_VALUE_SELECT = 'al-pathway-select-leaf-value';
5
+ const LEAF_VALUE_ITEM = 'al-pathway-select-leaf-value-item';
6
+ const LEAF_CHILD = 'al-pathway-leaf-child';
7
+
8
+ /**
9
+ * The al-pathway-selection element.
10
+ * This represents a leaf (and its children) in the pathway
11
+ * but also a selected value.
12
+ *
13
+ * @author Jelle De Loecker <jelle@elevenways.be>
14
+ * @since 0.2.6
15
+ * @version 0.2.6
16
+ */
17
+ const Selection = Function.inherits('Alchemy.Element.Form.Base', 'PathwaySelection');
18
+
19
+ /**
20
+ * The hawkejs template to use
21
+ *
22
+ * @author Jelle De Loecker <jelle@elevenways.be>
23
+ * @since 0.2.6
24
+ * @version 0.2.6
25
+ */
26
+ Selection.setTemplateFile('form/elements/al_pathway_selection');
27
+
28
+ /**
29
+ * The possibles leaves that can be chosen
30
+ *
31
+ * @author Jelle De Loecker <jelle@elevenways.be>
32
+ * @since 0.2.6
33
+ * @version 0.2.6
34
+ */
35
+ Selection.setAssignedProperty('leaf_options');
36
+
37
+ /**
38
+ * The current selected leaf
39
+ *
40
+ * @author Jelle De Loecker <jelle@elevenways.be>
41
+ * @since 0.2.6
42
+ * @version 0.2.6
43
+ */
44
+ Selection.setAssignedProperty('selected_leaf');
45
+
46
+ /**
47
+ * The current value
48
+ *
49
+ * @author Jelle De Loecker <jelle@elevenways.be>
50
+ * @since 0.2.6
51
+ * @version 0.2.6
52
+ */
53
+ Selection.setAssignedProperty('selected_value_id');
54
+
55
+ /**
56
+ * The value of the selection itself
57
+ *
58
+ * @author Jelle De Loecker <jelle@elevenways.be>
59
+ * @since 0.2.6
60
+ * @version 0.2.6
61
+ */
62
+ Selection.setAssignedProperty('value', function getValue(val) {
63
+
64
+ let new_val = this.getValue();
65
+
66
+ if (new_val) {
67
+ return new_val;
68
+ }
69
+
70
+ return val;
71
+ }, function setValue(val) {
72
+
73
+ if (!val) {
74
+ return;
75
+ }
76
+
77
+ if (val.leaf_id) {
78
+ let leaf_options = this.getLeafOptions();
79
+
80
+ if (leaf_options) {
81
+ for (let i = 0; i < leaf_options.length; i++) {
82
+ let leaf = leaf_options[i];
83
+
84
+ if (leaf.id == val.leaf_id) {
85
+ this.selected_leaf = leaf;
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ }
91
+
92
+ if (val.value_id) {
93
+ this.selected_value_id = val.value_id;
94
+ }
95
+ });
96
+
97
+ /**
98
+ * Get the current value
99
+ *
100
+ * @author Jelle De Loecker <jelle@elevenways.be>
101
+ * @since 0.2.6
102
+ * @version 0.2.6
103
+ */
104
+ Selection.setMethod(function getValue() {
105
+
106
+ let result = {
107
+ leaf_id : this.selected_leaf?.id,
108
+ value_id : this.selected_value_id,
109
+ child : null,
110
+ };
111
+
112
+ let children_wrapper = this.querySelector('.leaf-children');
113
+
114
+ if (children_wrapper?.children?.length) {
115
+ let child = children_wrapper.children[0];
116
+
117
+ result.child = child.getValue();
118
+ }
119
+
120
+ return result;
121
+ });
122
+
123
+
124
+ /**
125
+ * Get the root al-pathway element
126
+ *
127
+ * @author Jelle De Loecker <jelle@elevenways.be>
128
+ * @since 0.2.6
129
+ * @version 0.2.6
130
+ *
131
+ * @return {AlPathway}
132
+ */
133
+ Selection.setMethod(function getRootAlPathway() {
134
+ return this.closest('al-pathway');
135
+ });
136
+
137
+ /**
138
+ * Get the current selected value instance
139
+ *
140
+ * @author Jelle De Loecker <jelle@elevenways.be>
141
+ * @since 0.2.6
142
+ * @version 0.2.6
143
+ *
144
+ * @return {null|Promise}
145
+ */
146
+ Selection.setMethod(function getSelectedValue() {
147
+
148
+ if (!this.selected_value_id) {
149
+ return null;
150
+ }
151
+
152
+ if (!this.selected_leaf) {
153
+ return null;
154
+ }
155
+
156
+ let provider = this.selected_leaf.getProvider();
157
+
158
+ if (!provider) {
159
+ return;
160
+ }
161
+
162
+ return provider.getById(this.selected_value_id);
163
+ });
164
+
165
+ /**
166
+ * Trigger a change
167
+ *
168
+ * @author Jelle De Loecker <jelle@elevenways.be>
169
+ * @since 0.2.6
170
+ * @version 0.2.6
171
+ */
172
+ Selection.setMethod(function triggerChange() {
173
+
174
+ this.updateButtonTitle();
175
+
176
+ let root = this.getRootAlPathway();
177
+
178
+ if (root) {
179
+ root.triggerChange(this);
180
+ }
181
+ });
182
+
183
+ /**
184
+ * Update the button title
185
+ *
186
+ * @author Jelle De Loecker <jelle@elevenways.be>
187
+ * @since 0.2.6
188
+ * @version 0.2.6
189
+ */
190
+ Selection.setMethod(async function updateButtonTitle() {
191
+
192
+ let title = await this.getDisplayTitle();
193
+
194
+ if (typeof title == 'object' && typeof title.toElement == 'function') {
195
+ title = title.toElement();
196
+ }
197
+
198
+ let wrapper = this.querySelector('.select-button-title');
199
+
200
+ if (wrapper) {
201
+ Hawkejs.replaceChildren(wrapper, title);
202
+ }
203
+ });
204
+
205
+ /**
206
+ * Get the current title to display
207
+ *
208
+ * @author Jelle De Loecker <jelle@elevenways.be>
209
+ * @since 0.2.6
210
+ * @version 0.2.6
211
+ */
212
+ Selection.setMethod(function getDisplayTitle() {
213
+
214
+ let value_promise = this.getSelectedValue();
215
+
216
+ if (value_promise) {
217
+ let pledge = new Pledge();
218
+
219
+ Pledge.done(value_promise, (err, res) => {
220
+
221
+ if (err) {
222
+ pledge.reject(err);
223
+ return;
224
+ }
225
+
226
+ pledge.resolve(alchemy.getDisplayTitle(res));
227
+ });
228
+
229
+ return pledge;
230
+ }
231
+
232
+ if (this.selected_leaf) {
233
+ return this.selected_leaf.getDisplayTitle();
234
+ }
235
+
236
+ return new Classes.Alchemy.Microcopy('pathway-leaf-click-to-select');
237
+ });
238
+
239
+ /**
240
+ * The element is added to the DOM for the first time
241
+ *
242
+ * @author Jelle De Loecker <jelle@elevenways.be>
243
+ * @since 0.2.6
244
+ * @version 0.2.6
245
+ */
246
+ Selection.setMethod(function introduced() {
247
+
248
+ let select_button = this.querySelector('.leaf-info');
249
+
250
+ let added_listener = false;
251
+
252
+ select_button.addEventListener('click', (e) => {
253
+ const that = this;
254
+
255
+ e.preventDefault();
256
+ e.stopPropagation();
257
+
258
+ this.showLeafDropdown();
259
+
260
+ if (added_listener) {
261
+ return;
262
+ }
263
+
264
+ added_listener = true;
265
+
266
+ document.body.addEventListener('click', function onceOnClick(e) {
267
+
268
+ if (e.target.closest('.leaf-options')) {
269
+ return;
270
+ }
271
+
272
+ if (e.target.closest('.' + LEAF_DROPDOWN)) {
273
+ return;
274
+ }
275
+
276
+ if (that._current_element_under_us) {
277
+ that.removeDropdown();
278
+ }
279
+
280
+ document.body.removeEventListener('click', onceOnClick);
281
+ added_listener = false;
282
+ });
283
+ });
284
+
285
+ if (!this.selected_leaf) {
286
+
287
+ }
288
+
289
+ });
290
+
291
+ /**
292
+ * Get all the leaves this can represent
293
+ *
294
+ * @author Jelle De Loecker <jelle@elevenways.be>
295
+ * @since 0.2.6
296
+ * @version 0.2.6
297
+ *
298
+ * @return {Leaf[]}
299
+ */
300
+ Selection.setMethod(function getLeafOptions() {
301
+
302
+ if (this.leaf_options) {
303
+ return this.leaf_options;
304
+ }
305
+
306
+ if (this.selected_leaf) {
307
+ return [this.selected_leaf];
308
+ }
309
+
310
+ return null;
311
+ });
312
+
313
+ /**
314
+ * Show the leaf options
315
+ *
316
+ * @author Jelle De Loecker <jelle@elevenways.be>
317
+ * @since 0.2.6
318
+ * @version 0.2.6
319
+ */
320
+ Selection.setMethod(async function showLeafDropdown() {
321
+
322
+ let leaf_options = this.getLeafOptions();
323
+
324
+ if (!leaf_options?.length) {
325
+ return;
326
+ }
327
+
328
+ // Close all existing dropdowns
329
+ this.removeDropdown();
330
+
331
+ let div = this.createElement('div');
332
+ div.classList.add(LEAF_DROPDOWN);
333
+
334
+ if (leaf_options.length > 1) {
335
+ await this.addLeafSelectionElement(leaf_options, div);
336
+ } else {
337
+ await this.addValuesOfLeafToElement(leaf_options[0], div);
338
+ }
339
+
340
+ this.positionElementUnderUs(div);
341
+ });
342
+
343
+ /**
344
+ * Get a leaf option by id
345
+ *
346
+ * @author Jelle De Loecker <jelle@elevenways.be>
347
+ * @since 0.2.6
348
+ * @version 0.2.6
349
+ *
350
+ * @param {String} id
351
+ *
352
+ * @return {Leaf}
353
+ */
354
+ Selection.setMethod(function getLeafOptionById(id) {
355
+
356
+ let leaf_options = this.getLeafOptions();
357
+
358
+ if (!leaf_options) {
359
+ return null;
360
+ }
361
+
362
+ for (let leaf of leaf_options) {
363
+ if (leaf.id == id) {
364
+ return leaf;
365
+ }
366
+ }
367
+
368
+ return null;
369
+ });
370
+
371
+ /**
372
+ * Add the leaf options element to the given wrapper.
373
+ * The user will select a leaf type from this element.
374
+ *
375
+ * @author Jelle De Loecker <jelle@elevenways.be>
376
+ * @since 0.2.6
377
+ * @version 0.2.6
378
+ *
379
+ * @param {Leaf[]} options
380
+ * @param {HTMLElement} target_wrapper
381
+ */
382
+ Selection.setMethod(function addLeafSelectionElement(options, target_wrapper) {
383
+
384
+ let div = this.createElement('div');
385
+ div.classList.add(LEAF_TYPE_SELECT);
386
+
387
+ let ul = this.createElement('ul');
388
+ ul.classList.add(LEAF_TYPE_SELECT + '-ul');
389
+ div.appendChild(ul);
390
+
391
+ for (let leaf of options) {
392
+
393
+ let li = this.createElement('li');
394
+ li.classList.add(LEAF_TYPE_ITEM);
395
+
396
+ li.dataset.value = leaf.id;
397
+
398
+ let microcopy = this.createElement('micro-copy');
399
+ microcopy.key = 'pathway-leaf-selection-item';
400
+ microcopy.parameters = {leaf_id: leaf.id || leaf.name};
401
+
402
+ li.append(microcopy);
403
+
404
+ ul.append(li);
405
+ }
406
+
407
+ div.addEventListener('click', e => {
408
+
409
+ let clicked_on = e.target;
410
+
411
+ if (!clicked_on) {
412
+ return;
413
+ }
414
+
415
+ let li = clicked_on.closest('li');
416
+
417
+ if (!li) {
418
+ return;
419
+ }
420
+
421
+ let leaf_id = li.dataset.value;
422
+
423
+ let leaf = this.getLeafOptionById(leaf_id);
424
+
425
+ this.setSelectedLeaf(leaf);
426
+ this.addValuesOfLeafToElement(leaf, target_wrapper);
427
+ });
428
+
429
+ target_wrapper.appendChild(div);
430
+ });
431
+
432
+ /**
433
+ * Add the values of the given leaf to the given element
434
+ *
435
+ * @author Jelle De Loecker <jelle@elevenways.be>
436
+ * @since 0.2.6
437
+ * @version 0.2.6
438
+ *
439
+ * @param {Leaf} leaf
440
+ * @param {HTMLElement} target_wrapper
441
+ */
442
+ Selection.setMethod(async function addValuesOfLeafToElement(leaf, target_wrapper) {
443
+
444
+ let existing = target_wrapper.querySelector('.' + LEAF_VALUE_SELECT);
445
+
446
+ if (existing) {
447
+ existing.remove();
448
+ }
449
+
450
+ let values_element = await this.createLeafValuesElement(leaf);
451
+
452
+ if (!values_element) {
453
+ return;
454
+ }
455
+
456
+ target_wrapper.append(values_element);
457
+ });
458
+
459
+ /**
460
+ * Select a leaf
461
+ *
462
+ * @author Jelle De Loecker <jelle@elevenways.be>
463
+ * @since 0.2.6
464
+ * @version 0.2.6
465
+ *
466
+ * @param {mixed} leaf
467
+ */
468
+ Selection.setMethod(function setSelectedLeaf(leaf) {
469
+ this.selected_leaf = leaf;
470
+ this.selected_value_id = null;
471
+ this.triggerChange();
472
+ });
473
+
474
+ /**
475
+ * Set out leaf type options
476
+ *
477
+ * @author Jelle De Loecker <jelle@elevenways.be>
478
+ * @since 0.2.6
479
+ * @version 0.2.6
480
+ *
481
+ * @param {Leaf[]} leaves
482
+ */
483
+ Selection.setMethod(function setLeafOptions(leaves) {
484
+
485
+ if (!leaves?.length) {
486
+ return;
487
+ }
488
+
489
+ this.leaf_options = leaves;
490
+ });
491
+
492
+ /**
493
+ * Set the selected child
494
+ *
495
+ * @author Jelle De Loecker <jelle@elevenways.be>
496
+ * @since 0.2.6
497
+ * @version 0.2.6
498
+ *
499
+ * @param {mixed} value_id
500
+ */
501
+ Selection.setMethod(function setSelectedValue(value_id) {
502
+
503
+ if (!this.selected_leaf && this.leaf_options?.length == 1) {
504
+ this.setSelectedLeaf(this.leaf_options[0]);
505
+ }
506
+
507
+ this.selected_value_id = value_id;
508
+
509
+ this.removeDropdown();
510
+
511
+ let children = this.querySelector('.leaf-children');
512
+
513
+ if (!children) {
514
+ this.triggerChange();
515
+ return;
516
+ }
517
+
518
+ Hawkejs.removeChildren(children);
519
+
520
+ if (this.selected_leaf?.children?.length) {
521
+ let child_selection = this.createElement('al-pathway-selection');
522
+ child_selection.classList.add(LEAF_CHILD);
523
+ child_selection.setLeafOptions(this.selected_leaf?.children);
524
+
525
+ children.appendChild(child_selection);
526
+ }
527
+
528
+ this.triggerChange();
529
+ });
530
+
531
+
532
+ /**
533
+ * Update the children
534
+ *
535
+ * @author Jelle De Loecker <jelle@elevenways.be>
536
+ * @since 0.2.6
537
+ * @version 0.2.6
538
+ */
539
+ Selection.setMethod(function populateChildren(children) {
540
+
541
+ if (this.selected_leaf?.children?.length) {
542
+
543
+ if (!children) {
544
+ children = this.querySelector('.leaf-children');
545
+ }
546
+
547
+ let child_selection = this.createElement('al-pathway-selection');
548
+ child_selection.classList.add(LEAF_CHILD);
549
+ child_selection.setLeafOptions(this.selected_leaf?.children);
550
+
551
+ children.appendChild(child_selection);
552
+
553
+ let value = this.assigned_data.value;
554
+
555
+ if (value?.child) {
556
+ child_selection.value = value.child;
557
+ }
558
+ }
559
+ });
560
+
561
+ /**
562
+ * Show the leaf values
563
+ *
564
+ * @author Jelle De Loecker <jelle@elevenways.be>
565
+ * @since 0.2.6
566
+ * @version 0.2.6
567
+ *
568
+ * @param {Leaf} leaf
569
+ * @param {Element} values_element
570
+ */
571
+ Selection.setMethod(async function createLeafValuesElement(leaf, values_element) {
572
+
573
+ if (!values_element) {
574
+ values_element = this.createElement('div');
575
+ }
576
+
577
+ values_element.classList.add(LEAF_VALUE_SELECT);
578
+
579
+ let provider = leaf.getProvider();
580
+
581
+ if (!provider) {
582
+ return;
583
+ }
584
+
585
+ if (!provider.context) {
586
+ provider.context = {};
587
+ }
588
+
589
+ let root = this.queryUp('.al-pathway-selection-root');
590
+ provider.context.current_value = root.getValue();
591
+
592
+ let page_values = await provider.getAll();
593
+
594
+ if (!page_values) {
595
+ return;
596
+ }
597
+
598
+ let ul = this.createElement('ul');
599
+
600
+ for (let i = 0; i < page_values.length; i++) {
601
+ let value = page_values[i];
602
+
603
+ let option = this.createElement('li');
604
+ option.classList.add(LEAF_VALUE_ITEM);
605
+ option.setAttribute('data-value', value.$pk || value._id || value.id);
606
+ option.textContent = alchemy.getDisplayTitle(value);
607
+
608
+ ul.appendChild(option);
609
+ }
610
+
611
+ values_element.appendChild(ul);
612
+
613
+ values_element.addEventListener('click', (e) => {
614
+
615
+ let clicked_on = e.target;
616
+
617
+ if (!clicked_on) {
618
+ return;
619
+ }
620
+
621
+ let value_option = clicked_on.closest('.' + LEAF_VALUE_ITEM);
622
+
623
+ if (!value_option) {
624
+ return;
625
+ }
626
+
627
+ let value_id = value_option.dataset.value;
628
+
629
+ this.setSelectedValue(value_id);
630
+ });
631
+
632
+ return values_element;
633
+ });
634
+
635
+ /**
636
+ * Position the given element under us
637
+ *
638
+ * @author Jelle De Loecker <jelle@elevenways.be>
639
+ * @since 0.2.6
640
+ * @version 0.2.6
641
+ */
642
+ Selection.setMethod(function positionElementUnderUs(element) {
643
+
644
+ if (this._current_element_under_us) {
645
+ this._current_element_under_us.remove();
646
+ this._current_element_under_us = null;
647
+ return;
648
+ }
649
+
650
+ document.body.append(element);
651
+
652
+ let rect = this.getBoundingClientRect();
653
+
654
+ let left = rect.x,
655
+ top = rect.y;
656
+
657
+ top += rect.height + 5;
658
+
659
+ element.style.left = left + 'px';
660
+ element.style.top = top + 'px';
661
+ element.style.position = 'absolute';
662
+
663
+ this._current_element_under_us = element;
664
+ });
665
+
666
+ /**
667
+ * Remove the current dropdown
668
+ *
669
+ * @author Jelle De Loecker <jelle@elevenways.be>
670
+ * @since 0.2.6
671
+ * @version 0.2.6
672
+ */
673
+ Selection.setMethod(function removeDropdown() {
674
+
675
+ let elements = document.querySelectorAll('.' + LEAF_DROPDOWN),
676
+ result = false;
677
+
678
+ if (this._current_element_under_us) {
679
+ this._current_element_under_us.remove();
680
+ this._current_element_under_us = null;
681
+ result = true;
682
+ }
683
+
684
+ for (let i = 0; i < elements.length; i++) {
685
+ elements[i].remove();
686
+ result = true;
687
+ }
688
+
689
+ return result;
690
+ });
File without changes
@@ -72,16 +72,31 @@ QueryBuilderEntry.addElementGetter('value_input_wrapper', '.qb-value-input-wrapp
72
72
  */
73
73
  QueryBuilderEntry.addElementGetter('delete_button', '.qb-delete-entry');
74
74
 
75
+ /**
76
+ * Get the current operator
77
+ *
78
+ * @author Jelle De Loecker <jelle@elevenways.be>
79
+ * @since 0.2.6
80
+ * @version 0.2.6
81
+ */
82
+ QueryBuilderEntry.setProperty(function operator() {
83
+ return this.operator_select?.value;
84
+ }, function setValue(value) {
85
+ if (this.operator_select) {
86
+ this.operator_select.value = value;
87
+ }
88
+ });
89
+
75
90
  /**
76
91
  * Get/set the value
77
92
  *
78
93
  * @author Jelle De Loecker <jelle@elevenways.be>
79
94
  * @since 0.1.6
80
- * @version 0.1.6
95
+ * @version 0.2.6
81
96
  */
82
97
  QueryBuilderEntry.setProperty(function value() {
83
98
 
84
- if (!this.field_select.value) {
99
+ if (!this.field_select?.value) {
85
100
  return;
86
101
  }
87
102
 
@@ -325,7 +340,7 @@ QueryBuilderEntry.setMethod(async function showValueInput() {
325
340
  return;
326
341
  }
327
342
 
328
- let element = entry.createValueInput(this.hawkejs_renderer);
343
+ let element = entry.createValueInput(this.hawkejs_renderer, this);
329
344
 
330
345
  element.classList.add('qb-value-input');
331
346
 
File without changes
File without changes