alchemy-form 0.3.0-alpha.1 → 0.3.0-alpha.3

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 (47) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/assets/stylesheets/form/alchemy_form.scss +1 -2
  3. package/assets/stylesheets/form/elements/_button.scss +4 -31
  4. package/assets/stylesheets/form/elements/_dropdown.scss +93 -0
  5. package/assets/stylesheets/form/elements/_enum_badge.scss +7 -0
  6. package/assets/stylesheets/form/elements/_feedback_input.scss +2 -0
  7. package/assets/stylesheets/form/elements/_field.scss +16 -25
  8. package/assets/stylesheets/form/elements/_form.scss +7 -2
  9. package/assets/stylesheets/form/elements/_select.scss +176 -176
  10. package/assets/stylesheets/form/elements/_table.scss +117 -46
  11. package/assets/stylesheets/form/elements/_tabs.scss +25 -35
  12. package/assets/stylesheets/form/elements/index.scss +20 -18
  13. package/assets/stylesheets/form/general/index.scss +2 -2
  14. package/config/routes.js +10 -0
  15. package/controller/form_api_controller.js +28 -0
  16. package/element/00_form_base.js +82 -27
  17. package/element/10_dataprovider.js +2 -2
  18. package/element/al_button.js +12 -1
  19. package/element/al_dropdown.js +123 -0
  20. package/element/al_dropdown_item.js +40 -0
  21. package/element/al_enum_badge.js +157 -0
  22. package/element/al_field.js +196 -37
  23. package/element/al_field_array.js +22 -0
  24. package/element/al_field_schema.js +222 -55
  25. package/element/al_form.js +9 -6
  26. package/element/al_select.js +2 -2
  27. package/element/al_table.js +8 -2
  28. package/helper/field_recompute_handler.js +0 -2
  29. package/package.json +3 -2
  30. package/view/form/elements/al_dropdown.hwk +21 -0
  31. package/view/form/elements/al_enum_badge.hwk +9 -0
  32. package/view/form/elements/alchemy_field.hwk +3 -12
  33. package/view/form/elements/alchemy_field_array.hwk +16 -6
  34. package/view/form/elements/alchemy_field_array_entry.hwk +10 -5
  35. package/view/form/elements/alchemy_field_schema.hwk +2 -2
  36. package/view/form/inputs/edit/enum.hwk +1 -1
  37. package/view/form/inputs/edit_sw/fallback.hwk +1 -0
  38. package/view/form/inputs/view/association_alias.hwk +16 -0
  39. package/view/form/inputs/view/schema.hwk +4 -0
  40. package/view/form/inputs/view/string.hwk +1 -1
  41. package/view/form/inputs/view_inline/belongs_to.hwk +16 -0
  42. package/view/form/inputs/view_inline/boolean.hwk +24 -17
  43. package/view/form/inputs/view_inline/datetime.hwk +31 -24
  44. package/view/form/inputs/view_inline/enum.hwk +32 -1
  45. package/view/form/inputs/view_inline/objectid.hwk +9 -1
  46. package/view/form/inputs/view_inline/string.hwk +11 -3
  47. package/view/form/wrappers/edit_sw/default.hwk +1 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The <al-dropdown> element
3
+ *
4
+ * @author Jelle De Loecker <jelle@elevenways.be>
5
+ * @since 0.3.0
6
+ * @version 0.3.0
7
+ */
8
+ const Dropdown = Function.inherits('Alchemy.Element.Form.Base', 'Dropdown');
9
+
10
+ /**
11
+ * The template code
12
+ *
13
+ * @author Jelle De Loecker <jelle@elevenways.be>
14
+ * @since 0.3.0
15
+ * @version 0.3.0
16
+ */
17
+ Dropdown.setTemplateFile('form/elements/al_dropdown');
18
+
19
+ /**
20
+ * Is this dropdown open?
21
+ *
22
+ * @author Jelle De Loecker <jelle@elevenways.be>
23
+ * @since 0.3.0
24
+ * @version 0.3.0
25
+ */
26
+ Dropdown.defineStateVariable('is_open', {
27
+ type : 'boolean',
28
+ default : false,
29
+ on_change : function(editor) {
30
+ this.refreshDropdownPosition();
31
+ },
32
+ });
33
+
34
+ /**
35
+ * The dropdown wrapper element
36
+ *
37
+ * @author Jelle De Loecker <jelle@elevenways.be>
38
+ * @since 0.3.0
39
+ * @version 0.3.0
40
+ */
41
+ Dropdown.defineStateVariable('items_wrapper', {
42
+ type : 'element',
43
+ default : null,
44
+ });
45
+
46
+ /**
47
+ * The last chosen item
48
+ *
49
+ * @author Jelle De Loecker <jelle@elevenways.be>
50
+ * @since 0.3.0
51
+ * @version 0.3.0
52
+ */
53
+ Dropdown.defineStateVariable('last_chosen_item');
54
+
55
+ /**
56
+ * The "selected" item, if any.
57
+ * (This requires custom logic to be set)
58
+ *
59
+ * @author Jelle De Loecker <jelle@elevenways.be>
60
+ * @since 0.3.0
61
+ * @version 0.3.0
62
+ */
63
+ Dropdown.defineStateVariable('selected_item');
64
+
65
+ /**
66
+ * Toggle the dropdown state
67
+ *
68
+ * @author Jelle De Loecker <jelle@elevenways.be>
69
+ * @since 0.3.0
70
+ * @version 0.3.0
71
+ */
72
+ Dropdown.setMethod(function toggleDropdown() {
73
+ let is_open = this.getStateOptional('is_open');
74
+ is_open.value = !is_open.value;
75
+ });
76
+
77
+ /**
78
+ * Refresh the dropdown position
79
+ *
80
+ * @author Jelle De Loecker <jelle@elevenways.be>
81
+ * @since 0.3.0
82
+ * @version 0.3.0
83
+ */
84
+ Dropdown.setMethod(function refreshDropdownPosition() {
85
+
86
+ let is_open = this.getStateOptional('is_open');
87
+
88
+ if (!is_open.value) {
89
+ return;
90
+ }
91
+
92
+ let items_wrapper = this.getState('items_wrapper');
93
+
94
+ if (!items_wrapper) {
95
+ return;
96
+ }
97
+
98
+ let rect = this.getBoundingClientRect();
99
+
100
+ items_wrapper.style.left = rect.left + 'px';
101
+ items_wrapper.style.top = rect.bottom + 'px';
102
+ });
103
+
104
+ /**
105
+ * Added to the DOM for the first time
106
+ *
107
+ * @author Jelle De Loecker <jelle@elevenways.be>
108
+ * @since 0.3.0
109
+ * @version 0.3.0
110
+ */
111
+ Dropdown.setMethod(function introduced() {
112
+
113
+ let last_chosen_optional = this.getStateOptional('last_chosen_item');
114
+
115
+ this.addEventListener('click', e => {
116
+
117
+ let item = e.target.closest('al-dropdown-item');
118
+
119
+ if (item) {
120
+ last_chosen_optional.value = item;
121
+ }
122
+ });
123
+ });
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The <al-dropdown-item> element
3
+ *
4
+ * @author Jelle De Loecker <jelle@elevenways.be>
5
+ * @since 0.3.0
6
+ * @version 0.3.0
7
+ */
8
+ const DropdownItem = Function.inherits('Alchemy.Element.Form.Base', 'DropdownItem');
9
+
10
+ /**
11
+ * This has the button role
12
+ *
13
+ * @author Jelle De Loecker <jelle@elevenways.be>
14
+ * @since 0.3.0
15
+ * @version 0.3.0
16
+ */
17
+ DropdownItem.setRole('button');
18
+
19
+ /**
20
+ * Is this item selected somehow?
21
+ *
22
+ * @author Jelle De Loecker <jelle@elevenways.be>
23
+ * @since 0.3.0
24
+ * @version 0.3.0
25
+ */
26
+ DropdownItem.defineStateVariable('is_selected', {
27
+ type : 'boolean',
28
+ default : false,
29
+ on_change : function onSelectedChange(value) {
30
+ console.log('On change:', value);
31
+ if (value) {
32
+ let dropdown = this.closest('al-dropdown');
33
+
34
+ if (dropdown) {
35
+ let selected_item = dropdown.getStateOptional('selected_item');
36
+ selected_item.value = this;
37
+ }
38
+ }
39
+ }
40
+ });
@@ -0,0 +1,157 @@
1
+ /**
2
+ * The al-enum-badge class:
3
+ * Shows a selected enum value as a badge.
4
+ *
5
+ * @author Jelle De Loecker <jelle@elevenways.be>
6
+ * @since 0.3.0
7
+ * @version 0.3.0
8
+ */
9
+ const EnumBadge = Function.inherits('Alchemy.Element.Form.Base', 'EnumBadge');
10
+
11
+ /**
12
+ * The template to use for the content of this element
13
+ *
14
+ * @author Jelle De Loecker <jelle@develry.be>
15
+ * @since 0.3.0
16
+ * @version 0.3.0
17
+ */
18
+ EnumBadge.setTemplateFile('form/elements/al_enum_badge');
19
+
20
+ /**
21
+ * The ID of the enum value to show.
22
+ * Can be a string, a number, an ObjectId representation.
23
+ *
24
+ * @author Jelle De Loecker <jelle@elevenways.be>
25
+ * @since 0.3.0
26
+ * @version 0.3.0
27
+ */
28
+ EnumBadge.setAttribute('enum-id');
29
+
30
+ /**
31
+ * The optional Model to get the info from,
32
+ * in case the source is a Model.
33
+ *
34
+ * @author Jelle De Loecker <jelle@elevenways.be>
35
+ * @since 0.3.0
36
+ * @version 0.3.0
37
+ */
38
+ EnumBadge.setAttribute('model');
39
+
40
+ /**
41
+ * The optional enum-class to use (if the source is not just a model)
42
+ * This class has to be available on the client-side!
43
+ *
44
+ * @author Jelle De Loecker <jelle@elevenways.be>
45
+ * @since 0.3.0
46
+ * @version 0.3.0
47
+ */
48
+ EnumBadge.setAttribute('enum-class');
49
+
50
+ /**
51
+ * See if we need to prepare any render variables
52
+ *
53
+ * @author Jelle De Loecker <jelle@elevenways.be>
54
+ * @since 0.3.0
55
+ * @version 0.3.0
56
+ */
57
+ EnumBadge.setMethod(function prepareRenderVariables() {
58
+
59
+ let enum_id = this.enum_id;
60
+
61
+ if (!enum_id) {
62
+ return;
63
+ }
64
+
65
+ let enum_class = this.enum_class;
66
+
67
+ if (!enum_class) {
68
+
69
+ if (this.model) {
70
+ return this.prepareRenderVariablesFromModel();
71
+ }
72
+
73
+ return;
74
+ }
75
+
76
+ let constructor,
77
+ parent = Object.path(Classes, enum_class);
78
+
79
+ if (parent?.is_namespace) {
80
+ parent = parent[parent.name];
81
+ }
82
+
83
+ if (!parent) {
84
+ return;
85
+ }
86
+
87
+ // Not sure this will always be correct.
88
+ // Might have to loop over all the children.
89
+ // Or use `getDescendantsDict()` or `getDescendantsMap()`
90
+ constructor = parent.getDescendant(enum_id);
91
+
92
+ if (!constructor) {
93
+ return;
94
+ }
95
+
96
+ let title = constructor.title,
97
+ color,
98
+ index,
99
+ icon;
100
+
101
+ let enum_info = constructor.enum_info;
102
+
103
+ if (enum_info) {
104
+ if (enum_info.title) {
105
+ title = enum_info.title;
106
+ }
107
+
108
+ if (enum_info.icon) {
109
+ icon = enum_info.icon;
110
+ }
111
+
112
+ if (enum_info.index) {
113
+ index = enum_info.index;
114
+ }
115
+
116
+ if (enum_info.color) {
117
+ color = enum_info.color;
118
+ }
119
+ }
120
+
121
+ return {title, color, index, icon};
122
+ });
123
+
124
+ /**
125
+ * Get render variables from a model
126
+ *
127
+ * @author Jelle De Loecker <jelle@elevenways.be>
128
+ * @since 0.3.0
129
+ * @version 0.3.0
130
+ */
131
+ EnumBadge.setMethod(async function prepareRenderVariablesFromModel() {
132
+
133
+ let enum_id = this.enum_id,
134
+ model = this.model;
135
+
136
+ if (!enum_id || !model) {
137
+ return;
138
+ }
139
+
140
+ let resource_options = {
141
+ name : 'FormApi#enumInfo',
142
+ params : {
143
+ model_name : model,
144
+ id : enum_id
145
+ }
146
+ };
147
+
148
+ let result;
149
+
150
+ try {
151
+ result = await this.hawkejs_helpers.Alchemy.getResource(resource_options);
152
+ } catch (err) {
153
+ console.error('Failed to get enum info:', err);
154
+ }
155
+
156
+ return result;
157
+ });