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.
- package/CHANGELOG.md +27 -0
- package/assets/stylesheets/form/alchemy_form.scss +1 -2
- package/assets/stylesheets/form/elements/_button.scss +4 -31
- package/assets/stylesheets/form/elements/_dropdown.scss +93 -0
- package/assets/stylesheets/form/elements/_enum_badge.scss +7 -0
- package/assets/stylesheets/form/elements/_feedback_input.scss +2 -0
- package/assets/stylesheets/form/elements/_field.scss +16 -25
- package/assets/stylesheets/form/elements/_form.scss +7 -2
- package/assets/stylesheets/form/elements/_select.scss +176 -176
- package/assets/stylesheets/form/elements/_table.scss +117 -46
- package/assets/stylesheets/form/elements/_tabs.scss +25 -35
- package/assets/stylesheets/form/elements/index.scss +20 -18
- package/assets/stylesheets/form/general/index.scss +2 -2
- package/config/routes.js +10 -0
- package/controller/form_api_controller.js +28 -0
- package/element/00_form_base.js +82 -27
- package/element/10_dataprovider.js +2 -2
- package/element/al_button.js +12 -1
- package/element/al_dropdown.js +123 -0
- package/element/al_dropdown_item.js +40 -0
- package/element/al_enum_badge.js +157 -0
- package/element/al_field.js +196 -37
- package/element/al_field_array.js +22 -0
- package/element/al_field_schema.js +222 -55
- package/element/al_form.js +9 -6
- package/element/al_select.js +2 -2
- package/element/al_table.js +8 -2
- package/helper/field_recompute_handler.js +0 -2
- package/package.json +3 -2
- package/view/form/elements/al_dropdown.hwk +21 -0
- package/view/form/elements/al_enum_badge.hwk +9 -0
- package/view/form/elements/alchemy_field.hwk +3 -12
- package/view/form/elements/alchemy_field_array.hwk +16 -6
- package/view/form/elements/alchemy_field_array_entry.hwk +10 -5
- package/view/form/elements/alchemy_field_schema.hwk +2 -2
- package/view/form/inputs/edit/enum.hwk +1 -1
- package/view/form/inputs/edit_sw/fallback.hwk +1 -0
- package/view/form/inputs/view/association_alias.hwk +16 -0
- package/view/form/inputs/view/schema.hwk +4 -0
- package/view/form/inputs/view/string.hwk +1 -1
- package/view/form/inputs/view_inline/belongs_to.hwk +16 -0
- package/view/form/inputs/view_inline/boolean.hwk +24 -17
- package/view/form/inputs/view_inline/datetime.hwk +31 -24
- package/view/form/inputs/view_inline/enum.hwk +32 -1
- package/view/form/inputs/view_inline/objectid.hwk +9 -1
- package/view/form/inputs/view_inline/string.hwk +11 -3
- 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
|
+
});
|