alchemy-widget 0.1.6 → 0.2.0

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 (32) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/assets/stylesheets/{alchemy-widgets.scss → alchemy_widgets.scss} +158 -48
  3. package/bootstrap.js +4 -2
  4. package/element/00-widget_base_element.js +96 -4
  5. package/element/05-widget_element.js +4 -13
  6. package/element/10-container_elements.js +15 -15
  7. package/element/11-alchemy_widgets_list_element.js +2 -2
  8. package/element/20-add_area_element.js +22 -22
  9. package/element/table_of_contents_element.js +104 -8
  10. package/element/widget_actionbar_element.js +92 -0
  11. package/element/widget_context_element.js +39 -23
  12. package/element/widget_toolbar_element.js +295 -50
  13. package/helper/widget_action.js +10 -10
  14. package/helper/widgets/00-widget.js +54 -18
  15. package/helper/widgets/01-container.js +7 -7
  16. package/helper/widgets/05-list.js +1 -1
  17. package/helper/widgets/alchemy_field_widget.js +112 -0
  18. package/helper/widgets/alchemy_form_widget.js +183 -0
  19. package/helper/widgets/alchemy_table_widget.js +71 -0
  20. package/helper/widgets/alchemy_tabs_widget.js +195 -0
  21. package/helper/widgets/header.js +3 -3
  22. package/helper/widgets/markdown.js +17 -10
  23. package/helper/widgets/sourcecode.js +4 -4
  24. package/helper/widgets/table_of_contents.js +2 -2
  25. package/helper/widgets_helper.js +26 -0
  26. package/package.json +3 -2
  27. package/view/elements/table_of_contents.hwk +23 -9
  28. package/view/form/inputs/edit/widget.hwk +2 -2
  29. package/view/form/inputs/edit/widgets.hwk +2 -2
  30. package/view/widget/elements/al_widget_toolbar.hwk +49 -0
  31. package/view/widget/widget_config.hwk +7 -4
  32. package/assets/stylesheets/alchemy-widget-symbols.scss +0 -191
@@ -1,17 +1,17 @@
1
1
  /**
2
- * The alchemy-widgets element
2
+ * The al-widgets element
3
3
  *
4
4
  * @author Jelle De Loecker <jelle@elevenways.be>
5
5
  * @since 0.1.0
6
- * @version 0.1.0
6
+ * @version 0.2.0
7
7
  */
8
- let AddArea = Function.inherits('Alchemy.Element.Widget.Base', function AlchemyWidgetAddArea() {
9
- AlchemyWidgetAddArea.super.call(this);
8
+ let AddArea = Function.inherits('Alchemy.Element.Widget.Base', function WidgetAddArea() {
9
+ WidgetAddArea.super.call(this);
10
10
 
11
11
  this.innerHTML = `
12
12
  <div class="main-button">
13
- <button class="add-button widget-button" title="Add"><i class="gg-math-plus"></i></button>
14
- <button class="menu-button widget-button" title="Menu"><i class="gg-menu-grid-o"></i></button>
13
+ <button class="add-button widget-button" title="Add"><al-icon icon-name="plus"></al-icon></button>
14
+ <button class="menu-button widget-button" title="Menu"><al-icon icon-name="grid"></al-icon></button>
15
15
  </div>
16
16
  <div class="widget-types">
17
17
  TYPES
@@ -24,16 +24,16 @@ let AddArea = Function.inherits('Alchemy.Element.Widget.Base', function AlchemyW
24
24
  *
25
25
  * @author Jelle De Loecker <jelle@elevenways.be>
26
26
  * @since 0.1.0
27
- * @version 0.1.6
27
+ * @version 0.2.0
28
28
  */
29
29
  AddArea.setMethod(function showTypes(event) {
30
30
 
31
31
  let that = this;
32
32
 
33
- let context_button = document.querySelector('alchemy-widget-context');
33
+ let context_button = document.querySelector('al-widget-context');
34
34
 
35
- if (context_button && context_button.active_widget) {
36
- context_button.unselectedWidget();
35
+ if (context_button) {
36
+ context_button.forceUnselection();
37
37
  }
38
38
 
39
39
  let context = this.createElement('he-context-menu');
@@ -58,27 +58,27 @@ AddArea.setMethod(function showTypes(event) {
58
58
  });
59
59
 
60
60
  /**
61
- * Show the toolbar
61
+ * Show the actionbar
62
62
  *
63
63
  * @author Jelle De Loecker <jelle@elevenways.be>
64
64
  * @since 0.1.0
65
- * @version 0.1.0
65
+ * @version 0.2.0
66
66
  */
67
- AddArea.setMethod(function showToolbar() {
67
+ AddArea.setMethod(function showActionbar() {
68
68
 
69
- if (!this.toolbar) {
70
- this.toolbar = document.createElement('alchemy-widget-toolbar');
71
- this.append(this.toolbar);
69
+ if (!this.actionbar) {
70
+ this.actionbar = document.createElement('al-widget-actionbar');
71
+ this.append(this.actionbar);
72
72
  }
73
73
 
74
- if (this.toolbar.context_element == this && !this.toolbar.hidden) {
75
- this.toolbar.close();
74
+ if (this.actionbar.context_element == this && !this.actionbar.hidden) {
75
+ this.actionbar.close();
76
76
  return;
77
77
  }
78
78
 
79
- this.toolbar.hidden = false;
80
- this.toolbar.context_element = this;
81
- this.toolbar.showWidgetActions(this.parentElement);
79
+ this.actionbar.hidden = false;
80
+ this.actionbar.context_element = this;
81
+ this.actionbar.showWidgetActions(this.parentElement);
82
82
 
83
83
  });
84
84
 
@@ -106,6 +106,6 @@ AddArea.setMethod(function introduced() {
106
106
 
107
107
  context_button.addEventListener('click', function onClick(e) {
108
108
  e.preventDefault();
109
- that.showToolbar();
109
+ that.showActionbar();
110
110
  });
111
111
  });
@@ -16,6 +16,15 @@ const TableOfContents = Function.inherits('Alchemy.Element.App', 'TableOfContent
16
16
  */
17
17
  TableOfContents.setTemplateFile('elements/table_of_contents');
18
18
 
19
+ /**
20
+ * Set the actual tag name
21
+ *
22
+ * @author Jelle De Loecker <jelle@elevenways.be>
23
+ * @since 0.2.0
24
+ * @version 0.2.0
25
+ */
26
+ TableOfContents.setTagName('AL-TOC');
27
+
19
28
  /**
20
29
  * Set the content
21
30
  *
@@ -84,7 +93,7 @@ TableOfContents.setAttribute('intersection-class');
84
93
  *
85
94
  * @author Jelle De Loecker <jelle@elevenways.be>
86
95
  * @since 0.1.2
87
- * @version 0.1.2
96
+ * @version 0.2.0
88
97
  */
89
98
  TableOfContents.setProperty(function entries() {
90
99
 
@@ -105,7 +114,10 @@ TableOfContents.setProperty(function entries() {
105
114
  }
106
115
 
107
116
  if (wrapper) {
108
- let elements = wrapper.querySelectorAll(this.elements_selector || 'h1,h2'),
117
+
118
+ let current_level = null,
119
+ last_entry,
120
+ elements = wrapper.querySelectorAll(this.elements_selector || 'h1,h2'),
109
121
  element,
110
122
  title,
111
123
  i;
@@ -124,7 +136,9 @@ TableOfContents.setProperty(function entries() {
124
136
  }
125
137
  }
126
138
 
127
- let title_element;
139
+ let title_element,
140
+ starts_level,
141
+ ends_level;
128
142
 
129
143
  if (this.title_selector) {
130
144
  title_element = element.querySelector(this.title_selector);
@@ -134,6 +148,25 @@ TableOfContents.setProperty(function entries() {
134
148
  title_element = element;
135
149
  }
136
150
 
151
+ if (element.nodeName[0] == 'H' && isFinite(element.nodeName[1])) {
152
+ let heading_level = +element.nodeName[1];
153
+
154
+ if (current_level == null) {
155
+ current_level = heading_level;
156
+ } else if (heading_level > current_level) {
157
+ current_level++;
158
+ starts_level = true;
159
+ } else if (heading_level == current_level && last_entry) {
160
+ last_entry.starts_level = false;
161
+ } else if (heading_level < current_level) {
162
+ current_level--;
163
+
164
+ if (last_entry) {
165
+ last_entry.ends_level = true;
166
+ }
167
+ }
168
+ }
169
+
137
170
  title = (title_element.toc_title || title_element.textContent || '').trim();
138
171
 
139
172
  title = title.truncate(30);
@@ -143,11 +176,74 @@ TableOfContents.setProperty(function entries() {
143
176
  continue;
144
177
  }
145
178
 
146
- result.push({
147
- id : element.id,
148
- title : title,
149
- element : element,
150
- });
179
+ last_entry = {
180
+ id : element.id,
181
+ level : current_level,
182
+ title : title,
183
+ element : element,
184
+ starts_level : starts_level,
185
+ ends_level : ends_level,
186
+ };
187
+
188
+ result.push(last_entry);
189
+ }
190
+
191
+ let ended_level = false,
192
+ entries = result,
193
+ current_branch,
194
+ current_nodes = [];
195
+
196
+ result = current_nodes;
197
+ last_entry = null;
198
+
199
+ for (let entry of entries) {
200
+
201
+ if (ended_level) {
202
+
203
+ while (entry.level >= current_branch.level) {
204
+ current_branch = current_branch.parent;
205
+ current_nodes = current_branch?.children || result;
206
+
207
+ if (!current_branch) {
208
+ current_branch = result[result.length - 1];
209
+ break;
210
+ }
211
+ }
212
+
213
+ ended_level = false;
214
+ }
215
+
216
+ if (!current_branch) {
217
+ current_branch = entry;
218
+ } else {
219
+ entry.parent = current_branch;
220
+ }
221
+
222
+ if (entry.starts_level) {
223
+
224
+ current_branch = last_entry;
225
+
226
+ if (!current_branch.children) {
227
+ current_branch.children = [];
228
+ }
229
+
230
+ current_nodes = current_branch.children;
231
+ }
232
+
233
+ current_nodes.push(entry);
234
+
235
+ if (entry.ends_level) {
236
+ ended_level = true;
237
+ current_branch = entry.parent;
238
+ current_nodes = current_branch.children || result;
239
+
240
+ if (!current_branch) {
241
+ current_branch = result[result.length - 1];
242
+ break;
243
+ }
244
+ }
245
+
246
+ last_entry = entry;
151
247
  }
152
248
  }
153
249
 
@@ -0,0 +1,92 @@
1
+ /**
2
+ * The al-widget-actionbar element
3
+ *
4
+ * @author Jelle De Loecker <jelle@elevenways.be>
5
+ * @since 0.1.0
6
+ * @version 0.2.0
7
+ */
8
+ let Actionbar = Function.inherits('Alchemy.Element.Widget.Base', function WidgetActionbar() {
9
+ WidgetActionbar.super.call(this);
10
+ this.hidden = true;
11
+ });
12
+
13
+ /**
14
+ * Show the actions for the given widget
15
+ *
16
+ * @author Jelle De Loecker <jelle@elevenways.be>
17
+ * @since 0.1.0
18
+ * @version 0.2.0
19
+ *
20
+ * @param {HTMLElement} widget
21
+ */
22
+ Actionbar.setMethod(async function showWidgetActions(widget) {
23
+
24
+ if (!widget || !widget.instance) {
25
+ return;
26
+ }
27
+
28
+ const that = this;
29
+
30
+ let actions = await widget.instance.getActionbarActions();
31
+
32
+ // Clear all the old buttons
33
+ Hawkejs.removeChildren(this);
34
+
35
+ for (let action of actions) {
36
+
37
+ let button = this.createElement('button');
38
+ button.classList.add('aw-actionbar-button');
39
+
40
+ let content = action.getButtonContent();
41
+
42
+ if (!content) {
43
+ content = action.title;
44
+ }
45
+
46
+ if (typeof content == 'string') {
47
+ button.innerText = content;
48
+ } else if (content) {
49
+ if (Array.isArray(content)) {
50
+ for (let entry of content) {
51
+ button.append(entry);
52
+ }
53
+ } else {
54
+ button.append(content);
55
+ }
56
+ }
57
+
58
+ button.setAttribute('title', action.title);
59
+
60
+ let is_selected = action.isAlreadySelected(widget);
61
+
62
+ if (is_selected) {
63
+ button.classList.add('aw-button-selected');
64
+ }
65
+
66
+ button.addEventListener('click', function onClick(e) {
67
+
68
+ e.preventDefault();
69
+
70
+ action.applyOnWidget(widget, that);
71
+ });
72
+
73
+ this.append(button);
74
+ }
75
+ });
76
+
77
+ /**
78
+ * Close the actionbar
79
+ *
80
+ * @author Jelle De Loecker <jelle@elevenways.be>
81
+ * @since 0.1.0
82
+ * @version 0.1.0
83
+ */
84
+ Actionbar.setMethod(function close() {
85
+ this.hidden = true;
86
+
87
+ if (this.context_element && this.context_element.active_widget) {
88
+ this.context_element.active_widget.selectWidget();
89
+ }
90
+
91
+ this.context_element = null;
92
+ });
@@ -1,14 +1,14 @@
1
1
  /**
2
- * The alchemy-widget-context element
2
+ * The al-widget-context element
3
3
  *
4
4
  * @author Jelle De Loecker <jelle@elevenways.be>
5
5
  * @since 0.1.0
6
- * @version 0.1.0
6
+ * @version 0.2.0
7
7
  */
8
- let Awc = Function.inherits('Alchemy.Element.Widget.Base', function AlchemyWidgetContext() {
9
- AlchemyWidgetContext.super.call(this);
8
+ let Awc = Function.inherits('Alchemy.Element.Widget.Base', function WidgetContext() {
9
+ WidgetContext.super.call(this);
10
10
 
11
- this.innerHTML = `<button class="menu-button widget-button" title="Menu"><i class="gg-menu-grid-o"></i></button>`;
11
+ this.innerHTML = `<button class="menu-button widget-button" title="Menu"><al-icon icon-name="grid"></al-icon></button>`;
12
12
  this.hidden = true;
13
13
  });
14
14
 
@@ -45,48 +45,64 @@ Awc.setMethod(function moveToWidget(widget) {
45
45
  });
46
46
 
47
47
  /**
48
- * Exiting the given widget
48
+ * The given widget has been unselected
49
49
  *
50
50
  * @author Jelle De Loecker <jelle@elevenways.be>
51
51
  * @since 0.1.0
52
- * @version 0.1.0
52
+ * @version 0.2.0
53
53
  */
54
54
  Awc.setMethod(function unselectedWidget(widget) {
55
55
 
56
56
  this.hidden = true;
57
57
  this.active_widget = null;
58
58
 
59
- if (this.toolbar) {
60
- this.toolbar.hidden = true;
59
+ if (this.actionbar) {
60
+ this.actionbar.hidden = true;
61
61
  }
62
62
  });
63
63
 
64
64
  /**
65
- * Show the toolbar
65
+ * Force unselecting any widget
66
+ *
67
+ * @author Jelle De Loecker <jelle@elevenways.be>
68
+ * @since 0.2.0
69
+ * @version 0.2.0
70
+ */
71
+ Awc.setMethod(function forceUnselection() {
72
+
73
+ if (this.active_widget) {
74
+ this.active_widget.unselectWidget();
75
+ } else {
76
+ this.unselectedWidget();
77
+ }
78
+ });
79
+
80
+ /**
81
+ * Show the actionbar
66
82
  *
67
83
  * @author Jelle De Loecker <jelle@elevenways.be>
68
84
  * @since 0.1.0
69
- * @version 0.1.0
85
+ * @version 0.2.0
70
86
  */
71
- Awc.setMethod(function toggleToolbar() {
87
+ Awc.setMethod(function toggleActionbar() {
72
88
 
73
89
  if (!this.active_widget) {
74
90
  return;
75
91
  }
76
92
 
77
- if (!this.toolbar) {
78
- this.toolbar = document.createElement('alchemy-widget-toolbar');
79
- this.append(this.toolbar);
93
+ if (!this.actionbar) {
94
+ this.actionbar = document.createElement('al-widget-actionbar');
95
+ this.append(this.actionbar);
80
96
  }
81
97
 
82
- if (this.toolbar.context_element == this && !this.toolbar.hidden) {
83
- this.toolbar.close();
98
+ if (this.actionbar.context_element == this && !this.actionbar.hidden) {
99
+ this.actionbar.close();
84
100
  return;
85
101
  }
86
102
 
87
- this.toolbar.hidden = false;
88
- this.toolbar.context_element = this;
89
- this.toolbar.showWidgetActions(this.active_widget);
103
+ this.actionbar.hidden = false;
104
+ this.actionbar.context_element = this;
105
+ this.actionbar.showWidgetActions(this.active_widget);
90
106
  });
91
107
 
92
108
  /**
@@ -94,7 +110,7 @@ Awc.setMethod(function toggleToolbar() {
94
110
  *
95
111
  * @author Jelle De Loecker <jelle@elevenways.be>
96
112
  * @since 0.1.0
97
- * @version 0.1.0
113
+ * @version 0.2.0
98
114
  */
99
115
  Awc.setMethod(function introduced() {
100
116
 
@@ -110,7 +126,7 @@ Awc.setMethod(function introduced() {
110
126
  return that.exitingWidget();
111
127
  }
112
128
 
113
- that.toggleToolbar();
129
+ that.toggleActionbar();
114
130
  });
115
131
 
116
132
  document.addEventListener('click', e => {
@@ -129,7 +145,7 @@ Awc.setMethod(function introduced() {
129
145
  return;
130
146
  }
131
147
 
132
- return this.unselectedWidget();
148
+ return this.forceUnselection();
133
149
  });
134
150
 
135
151
  let update_scroll = () => {