@onetype/framework 2.0.52 → 2.0.54

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 (154) hide show
  1. package/addons/core/database/back/items/commands/create.js +1 -1
  2. package/addons/core/database/back/items/commands/delete.js +3 -3
  3. package/addons/core/database/back/items/commands/update.js +1 -1
  4. package/addons/float/popup/css/popup.css +2 -2
  5. package/addons/render/directives/front/functions/process.js +3 -1
  6. package/addons/render/directives/front/items/self/160-slot.js +9 -1
  7. package/addons/render/directives/front/items/self/660-form.js +19 -13
  8. package/addons/render/editor/addon.js +13 -0
  9. package/addons/render/editor/functions/block/add.js +57 -0
  10. package/addons/render/editor/functions/block/delete.js +32 -0
  11. package/addons/render/editor/functions/block/find.js +30 -0
  12. package/addons/render/editor/functions/render/block.js +114 -0
  13. package/addons/render/editor/functions/render/blocks.js +31 -0
  14. package/addons/render/editor/items/elements/editor.js +69 -0
  15. package/addons/render/editor/items/self/paragraph.js +21 -0
  16. package/addons/render/editor/styles/editor.css +252 -0
  17. package/addons/render/elements/front/functions/types/colors/badge.js +19 -0
  18. package/addons/render/elements/front/functions/types/colors/status.js +24 -0
  19. package/addons/render/elements/front/functions/types/escape.js +8 -0
  20. package/addons/render/elements/front/functions/types/format/currency.js +16 -0
  21. package/addons/render/elements/front/functions/types/format/date.js +16 -0
  22. package/addons/render/elements/front/functions/types/format/number.js +24 -0
  23. package/addons/render/elements/front/functions/types/format/timeago.js +43 -0
  24. package/addons/render/elements/front/functions/types/render/avatar.js +10 -0
  25. package/addons/render/elements/front/functions/types/render/badge.js +17 -0
  26. package/addons/render/elements/front/functions/types/render/boolean.js +8 -0
  27. package/addons/render/elements/front/functions/types/render/chip.js +6 -0
  28. package/addons/render/elements/front/functions/types/render/currency.js +7 -0
  29. package/addons/render/elements/front/functions/types/render/date.js +6 -0
  30. package/addons/render/elements/front/functions/types/render/description.js +12 -0
  31. package/addons/render/elements/front/functions/types/render/group.js +11 -0
  32. package/addons/render/elements/front/functions/types/render/icon.js +8 -0
  33. package/addons/render/elements/front/functions/types/render/image.js +9 -0
  34. package/addons/render/elements/front/functions/types/render/link.js +8 -0
  35. package/addons/render/elements/front/functions/types/render/media.js +16 -0
  36. package/addons/render/elements/front/functions/types/render/metric.js +13 -0
  37. package/addons/render/elements/front/functions/types/render/number.js +6 -0
  38. package/addons/render/elements/front/functions/types/render/progress.js +13 -0
  39. package/addons/render/elements/front/functions/types/render/status.js +12 -0
  40. package/addons/render/elements/front/functions/types/render/tag.js +6 -0
  41. package/addons/render/elements/front/functions/types/render/tags.js +11 -0
  42. package/addons/render/elements/front/functions/types/render/text.js +8 -0
  43. package/addons/render/elements/front/functions/types/render/timeago.js +6 -0
  44. package/addons/render/elements/front/functions/types/render.js +16 -0
  45. package/addons/render/elements/front/items/directives/element.js +8 -3
  46. package/addons/render/elements/front/items/self/cards/info/info.css +499 -0
  47. package/addons/render/elements/front/items/self/cards/info/info.js +224 -0
  48. package/addons/render/elements/front/items/self/cards/item/item.css +614 -0
  49. package/addons/render/elements/front/items/self/cards/item/item.js +200 -0
  50. package/addons/render/elements/front/items/self/cards/pricing/pricing.css +318 -46
  51. package/addons/render/elements/front/items/self/cards/pricing/pricing.js +81 -30
  52. package/addons/render/elements/front/items/self/cards/profile/profile.css +446 -0
  53. package/addons/render/elements/front/items/self/cards/profile/profile.js +186 -0
  54. package/addons/render/elements/front/items/self/cards/share/share.css +445 -0
  55. package/addons/render/elements/front/items/self/cards/share/share.js +316 -0
  56. package/addons/render/elements/front/items/self/cards/stat/stat.css +356 -0
  57. package/addons/render/elements/front/items/self/cards/stat/stat.js +146 -0
  58. package/addons/render/elements/front/items/self/charts/bar/bar.css +263 -0
  59. package/addons/render/elements/front/items/self/charts/bar/bar.js +156 -0
  60. package/addons/render/elements/front/items/self/charts/donut/donut.css +222 -0
  61. package/addons/render/elements/front/items/self/charts/donut/donut.js +164 -0
  62. package/addons/render/elements/front/items/self/charts/line/line.css +229 -0
  63. package/addons/render/elements/front/items/self/charts/line/line.js +249 -0
  64. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.css +102 -0
  65. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.js +164 -0
  66. package/addons/render/elements/front/items/self/core/builder/builder.css +71 -116
  67. package/addons/render/elements/front/items/self/core/builder/builder.js +212 -127
  68. package/addons/render/elements/front/items/self/core/repeater/repeater.css +338 -71
  69. package/addons/render/elements/front/items/self/core/repeater/repeater.js +191 -44
  70. package/addons/render/elements/front/items/self/data/filters/filters.css +541 -0
  71. package/addons/render/elements/front/items/self/data/filters/filters.js +504 -0
  72. package/addons/render/elements/front/items/self/data/table/table.css +588 -0
  73. package/addons/render/elements/front/items/self/data/table/table.js +589 -0
  74. package/addons/render/elements/front/items/self/form/button/button.css +430 -103
  75. package/addons/render/elements/front/items/self/form/button/button.js +109 -101
  76. package/addons/render/elements/front/items/self/form/checkbox/checkbox.css +356 -39
  77. package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +109 -75
  78. package/addons/render/elements/front/items/self/form/color/color.css +255 -61
  79. package/addons/render/elements/front/items/self/form/color/color.js +135 -41
  80. package/addons/render/elements/front/items/self/form/date/date.css +289 -38
  81. package/addons/render/elements/front/items/self/form/date/date.js +108 -24
  82. package/addons/render/elements/front/items/self/form/editor/editor.css +447 -0
  83. package/addons/render/elements/front/items/self/form/editor/editor.js +794 -0
  84. package/addons/render/elements/front/items/self/form/field/field.css +160 -29
  85. package/addons/render/elements/front/items/self/form/field/field.js +36 -16
  86. package/addons/render/elements/front/items/self/form/input/input.css +272 -32
  87. package/addons/render/elements/front/items/self/form/input/input.js +324 -124
  88. package/addons/render/elements/front/items/self/form/radio/radio.css +310 -45
  89. package/addons/render/elements/front/items/self/form/radio/radio.js +99 -80
  90. package/addons/render/elements/front/items/self/form/rating/rating.css +234 -57
  91. package/addons/render/elements/front/items/self/form/rating/rating.js +216 -86
  92. package/addons/render/elements/front/items/self/form/section/section.css +247 -32
  93. package/addons/render/elements/front/items/self/form/section/section.js +53 -16
  94. package/addons/render/elements/front/items/self/form/select/select.css +362 -64
  95. package/addons/render/elements/front/items/self/form/select/select.js +156 -30
  96. package/addons/render/elements/front/items/self/form/slider/slider.css +331 -123
  97. package/addons/render/elements/front/items/self/form/slider/slider.js +124 -26
  98. package/addons/render/elements/front/items/self/form/tags/tags.css +328 -53
  99. package/addons/render/elements/front/items/self/form/tags/tags.js +155 -28
  100. package/addons/render/elements/front/items/self/form/textarea/textarea.css +128 -27
  101. package/addons/render/elements/front/items/self/form/textarea/textarea.js +172 -113
  102. package/addons/render/elements/front/items/self/form/toggle/toggle.css +239 -39
  103. package/addons/render/elements/front/items/self/form/toggle/toggle.js +32 -17
  104. package/addons/render/elements/front/items/self/form/transfer/transfer.css +377 -0
  105. package/addons/render/elements/front/items/self/form/transfer/transfer.js +453 -0
  106. package/addons/render/elements/front/items/self/form/upload/upload.css +408 -0
  107. package/addons/render/elements/front/items/self/form/upload/upload.js +469 -0
  108. package/addons/render/elements/front/items/self/global/accordion/accordion.css +377 -0
  109. package/addons/render/elements/front/items/self/global/accordion/accordion.js +135 -0
  110. package/addons/render/elements/front/items/self/global/code/code.css +207 -44
  111. package/addons/render/elements/front/items/self/global/code/code.js +327 -19
  112. package/addons/render/elements/front/items/self/global/gallery/gallery.css +521 -0
  113. package/addons/render/elements/front/items/self/global/gallery/gallery.js +291 -0
  114. package/addons/render/elements/front/items/self/global/heading/heading.css +151 -49
  115. package/addons/render/elements/front/items/self/global/heading/heading.js +30 -15
  116. package/addons/render/elements/front/items/self/global/markdown/markdown.css +284 -135
  117. package/addons/render/elements/front/items/self/global/markdown/markdown.js +35 -5
  118. package/addons/render/elements/front/items/self/global/menu/menu.css +311 -56
  119. package/addons/render/elements/front/items/self/global/menu/menu.js +95 -47
  120. package/addons/render/elements/front/items/self/global/notice/notice.css +263 -23
  121. package/addons/render/elements/front/items/self/global/notice/notice.js +51 -11
  122. package/addons/render/elements/front/items/self/global/parameters/parameters.css +276 -33
  123. package/addons/render/elements/front/items/self/global/parameters/parameters.js +86 -16
  124. package/addons/render/elements/front/items/self/global/tags/tags.css +215 -29
  125. package/addons/render/elements/front/items/self/global/tags/tags.js +91 -17
  126. package/addons/render/elements/front/items/self/navigation/dock/dock.css +221 -0
  127. package/addons/render/elements/front/items/self/navigation/dock/dock.js +134 -0
  128. package/addons/render/elements/front/items/self/navigation/footer/footer.css +356 -0
  129. package/addons/render/elements/front/items/self/navigation/footer/footer.js +219 -0
  130. package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +736 -76
  131. package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +437 -29
  132. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +327 -196
  133. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +115 -62
  134. package/addons/render/elements/front/items/self/navigation/steps/steps.css +345 -0
  135. package/addons/render/elements/front/items/self/navigation/steps/steps.js +113 -0
  136. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +507 -33
  137. package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +62 -19
  138. package/addons/render/elements/front/items/self/status/code/code.css +83 -12
  139. package/addons/render/elements/front/items/self/status/code/code.js +15 -4
  140. package/addons/render/elements/front/items/self/status/empty/empty.css +95 -15
  141. package/addons/render/elements/front/items/self/status/empty/empty.js +17 -12
  142. package/addons/render/elements/front/items/self/status/error/error.css +99 -14
  143. package/addons/render/elements/front/items/self/status/error/error.js +21 -11
  144. package/addons/render/elements/front/items/self/status/loading/loading.css +85 -14
  145. package/addons/render/elements/front/items/self/status/loading/loading.js +5 -6
  146. package/addons/render/elements/front/styles/types.css +363 -0
  147. package/instructions.txt +28 -0
  148. package/lib/load.js +1 -0
  149. package/lib/styles/reset.css +89 -76
  150. package/package.json +1 -1
  151. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.css +0 -410
  152. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.js +0 -191
  153. package/addons/render/elements/front/items/self/global/faq/faq.css +0 -98
  154. package/addons/render/elements/front/items/self/global/faq/faq.js +0 -56
@@ -38,7 +38,7 @@ onetype.AddonReady('commands', (commands) =>
38
38
 
39
39
  const item = addon.Item(properties.data);
40
40
 
41
- const allowed = expose.create.call({http: this.http, properties, item});
41
+ const allowed = await expose.create.call({http: this.http, properties, item});
42
42
 
43
43
  if(allowed !== true)
44
44
  {
@@ -35,19 +35,19 @@ onetype.AddonReady('commands', (commands) =>
35
35
  return resolve(null, 'Delete is not allowed.', 403);
36
36
  }
37
37
 
38
- if(!properties.data?.id || (typeof properties.data.id !== 'string' && typeof properties.data.id !== 'number'))
38
+ if(!properties.id || (typeof properties.id !== 'string' && typeof properties.id !== 'number'))
39
39
  {
40
40
  return resolve(null, 'Invalid or missing id.', 400);
41
41
  }
42
42
 
43
- const item = await addon.Find().filter('id', properties.data.id).one(true);
43
+ const item = await addon.Find().filter('id', properties.id).one(true);
44
44
 
45
45
  if(!item)
46
46
  {
47
47
  return resolve(null, 'Item not found.', 404);
48
48
  }
49
49
 
50
- const allowed = expose.delete.call({http: this.http, properties, item});
50
+ const allowed = await expose.delete.call({http: this.http, properties, item});
51
51
 
52
52
  if(allowed !== true)
53
53
  {
@@ -54,7 +54,7 @@ onetype.AddonReady('commands', (commands) =>
54
54
  item.Set(key, value);
55
55
  });
56
56
 
57
- const allowed = expose.update.call({http: this.http, properties, item});
57
+ const allowed = await expose.update.call({http: this.http, properties, item});
58
58
 
59
59
  if(allowed !== true)
60
60
  {
@@ -209,8 +209,8 @@
209
209
  border-top: 1px solid var(--ot-bg-1-border);
210
210
  }
211
211
 
212
- .ot-confirm > .actions > *
212
+ .ot-confirm > .actions > *,
213
+ .ot-confirm > .actions > * > *
213
214
  {
214
- flex: 1;
215
215
  width: 100%;
216
216
  }
@@ -24,7 +24,9 @@ directives.Fn('process', function(trigger, item, compile, node, identifier)
24
24
 
25
25
  if(node.nodeType === 1)
26
26
  {
27
- if(!node.attributes.length && !node.tagName.includes('-'))
27
+ const tagLower = node.tagName.toLowerCase();
28
+
29
+ if(!node.attributes.length && !tagLower.includes('-') && tagLower !== 'slot' && tagLower !== 'render')
28
30
  {
29
31
  return;
30
32
  }
@@ -9,12 +9,20 @@ onetype.AddonReady('directives', function(directives)
9
9
  trigger: 'node',
10
10
  order: 160,
11
11
  tag: 'slot',
12
+ strict: true,
12
13
  attributes: {
13
14
  'name': ['string']
14
15
  },
15
16
  code: function(data, item, compile, node, id)
16
17
  {
17
- const name = data['name']?.value || 'default';
18
+ const name = data['name']?.value;
19
+
20
+ if(!name)
21
+ {
22
+ node.remove();
23
+ return;
24
+ }
25
+
18
26
  const slot = item.Slots[name];
19
27
 
20
28
  if (slot && slot.Element)
@@ -59,8 +59,9 @@ onetype.AddonReady('directives', function(directives)
59
59
  if(!compile.data[config.bind])
60
60
  {
61
61
  compile.data[config.bind] = {
62
- response: null,
63
- error: null,
62
+ data: null,
63
+ message: null,
64
+ code: null,
64
65
  loading: false
65
66
  };
66
67
  }
@@ -127,7 +128,7 @@ onetype.AddonReady('directives', function(directives)
127
128
 
128
129
  if(!config.endpoint)
129
130
  {
130
- state.response = submitData;
131
+ state.data = submitData;
131
132
  config.onSuccess && await config.onSuccess(submitData);
132
133
  config.reset && form.reset();
133
134
  compile.data.Update();
@@ -135,7 +136,8 @@ onetype.AddonReady('directives', function(directives)
135
136
  }
136
137
 
137
138
  state.loading = true;
138
- state.error = null;
139
+ state.message = null;
140
+ state.code = null;
139
141
  compile.data.Update();
140
142
 
141
143
  try
@@ -148,17 +150,20 @@ onetype.AddonReady('directives', function(directives)
148
150
  body: JSON.stringify(submitData)
149
151
  });
150
152
 
151
- if(!response.ok)
152
- {
153
- throw onetype.Error(response.status, 'HTTP :status:.', { status: response.status });
154
- }
155
-
156
153
  const result = await response.json();
157
154
 
158
- state.response = result.data !== undefined ? result.data : result;
159
- state.error = null;
155
+ state.data = result.data || null;
156
+ state.message = result.message || null;
157
+ state.code = result.code || response.status;
160
158
  state.loading = false;
161
159
 
160
+ if(!response.ok)
161
+ {
162
+ config.onError && config.onError(state);
163
+ compile.data.Update();
164
+ return;
165
+ }
166
+
162
167
  config.reset && form.reset();
163
168
 
164
169
  if(config.redirect)
@@ -171,8 +176,9 @@ onetype.AddonReady('directives', function(directives)
171
176
  }
172
177
  catch(error)
173
178
  {
174
- state.response = null;
175
- state.error = error.message;
179
+ state.data = null;
180
+ state.message = error.message;
181
+ state.code = 0;
176
182
  state.loading = false;
177
183
 
178
184
  config.onError && config.onError(state);
@@ -0,0 +1,13 @@
1
+ const editor = onetype.Addon('editor', (addon) =>
2
+ {
3
+ addon.Field('id', ['string']);
4
+ addon.Field('icon', ['string', 'edit_note']);
5
+ addon.Field('name', ['string', '']);
6
+ addon.Field('category', ['string', '']);
7
+ addon.Field('editable', ['boolean', false]);
8
+ addon.Field('children', ['boolean', false]);
9
+ addon.Field('config', ['object', {}]);
10
+ addon.Field('insert', ['function']);
11
+ addon.Field('update', ['function']);
12
+ addon.Field('remove', ['function']);
13
+ });
@@ -0,0 +1,57 @@
1
+ onetype.AddonReady('editor', (editor) =>
2
+ {
3
+ editor.Fn('block.add', function(instance, type, afterUid, data)
4
+ {
5
+ const block = {
6
+ uid: onetype.GenerateUID(),
7
+ type: type,
8
+ data: data || {},
9
+ children: []
10
+ };
11
+
12
+ const container = instance.Element.querySelector('.ot-editor-blocks');
13
+
14
+ if(!container)
15
+ {
16
+ return null;
17
+ }
18
+
19
+ const node = editor.Fn('render.block', instance, block);
20
+
21
+ if(!node)
22
+ {
23
+ return null;
24
+ }
25
+
26
+ if(afterUid)
27
+ {
28
+ const index = instance.blocks.findIndex(b => b.uid === afterUid);
29
+ const afterNode = container.querySelector('[data-uid="' + afterUid + '"]');
30
+
31
+ if(index !== -1 && afterNode)
32
+ {
33
+ instance.blocks.splice(index + 1, 0, block);
34
+ afterNode.after(node);
35
+ }
36
+ else
37
+ {
38
+ instance.blocks.push(block);
39
+ container.appendChild(node);
40
+ }
41
+ }
42
+ else
43
+ {
44
+ instance.blocks.push(block);
45
+ container.appendChild(node);
46
+ }
47
+
48
+ const placeholder = instance.Element.querySelector('.ot-editor-placeholder');
49
+
50
+ if(placeholder)
51
+ {
52
+ placeholder.style.display = 'none';
53
+ }
54
+
55
+ return block;
56
+ });
57
+ });
@@ -0,0 +1,32 @@
1
+ onetype.AddonReady('editor', (editor) =>
2
+ {
3
+ editor.Fn('block.delete', function(instance, uid)
4
+ {
5
+ const found = editor.Fn('block.find', instance, uid);
6
+
7
+ if(!found)
8
+ {
9
+ return;
10
+ }
11
+
12
+ const type = editor.ItemGet(found.block.type);
13
+ const node = instance.Element.querySelector('[data-uid="' + uid + '"]');
14
+
15
+ if(type && type.Get('remove'))
16
+ {
17
+ type.Get('remove').call(null, node);
18
+ }
19
+
20
+ found.list.splice(found.index, 1);
21
+
22
+ if(node)
23
+ {
24
+ node.remove();
25
+ }
26
+
27
+ if(!instance.blocks.length)
28
+ {
29
+ editor.Fn('block.add', instance, 'paragraph', null, {});
30
+ }
31
+ });
32
+ });
@@ -0,0 +1,30 @@
1
+ onetype.AddonReady('editor', (editor) =>
2
+ {
3
+ editor.Fn('block.find', function(instance, uid, source)
4
+ {
5
+ source = source || instance.blocks;
6
+
7
+ for(let i = 0; i < source.length; i++)
8
+ {
9
+ if(source[i].uid === uid)
10
+ {
11
+ return { block: source[i], list: source, index: i };
12
+ }
13
+
14
+ if(source[i].children)
15
+ {
16
+ for(let z = 0; z < source[i].children.length; z++)
17
+ {
18
+ const found = editor.Fn('block.find', instance, uid, source[i].children[z]);
19
+
20
+ if(found)
21
+ {
22
+ return found;
23
+ }
24
+ }
25
+ }
26
+ }
27
+
28
+ return null;
29
+ });
30
+ });
@@ -0,0 +1,114 @@
1
+ onetype.AddonReady('editor', (editor) =>
2
+ {
3
+ editor.Fn('render.block', function(instance, block)
4
+ {
5
+ const type = editor.ItemGet(block.type);
6
+
7
+ if(!type)
8
+ {
9
+ return null;
10
+ }
11
+
12
+ const wrapper = document.createElement('div');
13
+ wrapper.className = 'ot-block';
14
+ wrapper.setAttribute('data-uid', block.uid);
15
+ wrapper.setAttribute('data-type', block.type);
16
+ wrapper.setAttribute('tabindex', '-1');
17
+
18
+ const gutter = document.createElement('div');
19
+ gutter.className = 'ot-block-gutter';
20
+ gutter.innerHTML = '<button class="ot-block-handle" draggable="true"><i>drag_indicator</i></button><button class="ot-block-add"><i>add</i></button>';
21
+
22
+ const content = document.createElement('div');
23
+ content.className = 'ot-block-content';
24
+ content.innerHTML = type.Get('insert').call(null, block.data);
25
+
26
+ const actions = document.createElement('div');
27
+ actions.className = 'ot-block-actions';
28
+ actions.innerHTML = '<button class="ot-block-settings"><i>more_vert</i></button>';
29
+
30
+ wrapper.appendChild(gutter);
31
+ wrapper.appendChild(content);
32
+ wrapper.appendChild(actions);
33
+
34
+ if(type.Get('editable'))
35
+ {
36
+ const target = content.firstElementChild;
37
+
38
+ if(target)
39
+ {
40
+ target.setAttribute('contenteditable', 'true');
41
+ target.setAttribute('data-placeholder', instance.placeholder || 'Type something...');
42
+
43
+ target.addEventListener('input', () =>
44
+ {
45
+ block.data.content = target.innerHTML;
46
+
47
+ if(instance._change)
48
+ {
49
+ instance._change({ value: instance.getValue() });
50
+ }
51
+ });
52
+
53
+ target.addEventListener('keydown', (e) =>
54
+ {
55
+ if(e.key === 'Enter' && !e.shiftKey)
56
+ {
57
+ e.preventDefault();
58
+ const newBlock = editor.Fn('block.add', instance, 'paragraph', block.uid, {});
59
+
60
+ if(newBlock)
61
+ {
62
+ const newNode = instance.Element.querySelector('[data-uid="' + newBlock.uid + '"]');
63
+
64
+ if(newNode)
65
+ {
66
+ const editable = newNode.querySelector('[contenteditable]');
67
+ if(editable) editable.focus();
68
+ }
69
+ }
70
+ }
71
+
72
+ if(e.key === 'Backspace' && target.innerHTML === '' && instance.blocks.length > 1)
73
+ {
74
+ e.preventDefault();
75
+
76
+ const index = instance.blocks.findIndex(b => b.uid === block.uid);
77
+ const prev = index > 0 ? instance.blocks[index - 1] : null;
78
+
79
+ editor.Fn('block.delete', instance, block.uid);
80
+
81
+ if(prev)
82
+ {
83
+ const prevNode = instance.Element.querySelector('[data-uid="' + prev.uid + '"]');
84
+
85
+ if(prevNode)
86
+ {
87
+ const editable = prevNode.querySelector('[contenteditable]');
88
+ if(editable) editable.focus();
89
+ }
90
+ }
91
+ }
92
+ });
93
+ }
94
+ }
95
+
96
+ gutter.querySelector('.ot-block-add').addEventListener('click', () =>
97
+ {
98
+ const newBlock = editor.Fn('block.add', instance, 'paragraph', block.uid, {});
99
+
100
+ if(newBlock)
101
+ {
102
+ const newNode = instance.Element.querySelector('[data-uid="' + newBlock.uid + '"]');
103
+
104
+ if(newNode)
105
+ {
106
+ const editable = newNode.querySelector('[contenteditable]');
107
+ if(editable) editable.focus();
108
+ }
109
+ }
110
+ });
111
+
112
+ return wrapper;
113
+ });
114
+ });
@@ -0,0 +1,31 @@
1
+ onetype.AddonReady('editor', (editor) =>
2
+ {
3
+ editor.Fn('render.blocks', function(instance)
4
+ {
5
+ const container = instance.Element.querySelector('.ot-editor-blocks');
6
+
7
+ if(!container)
8
+ {
9
+ return;
10
+ }
11
+
12
+ container.innerHTML = '';
13
+
14
+ instance.blocks.forEach(block =>
15
+ {
16
+ const node = editor.Fn('render.block', instance, block);
17
+
18
+ if(node)
19
+ {
20
+ container.appendChild(node);
21
+ }
22
+ });
23
+
24
+ const placeholder = instance.Element.querySelector('.ot-editor-placeholder');
25
+
26
+ if(placeholder)
27
+ {
28
+ placeholder.style.display = instance.blocks.length ? 'none' : '';
29
+ }
30
+ });
31
+ });
@@ -0,0 +1,69 @@
1
+ onetype.AddonReady('elements', (elements) =>
2
+ {
3
+ elements.ItemAdd({
4
+ id: 'editor',
5
+ icon: 'edit_note',
6
+ name: 'Block Editor',
7
+ description: 'Block-based content editor.',
8
+ category: 'Form',
9
+ config: {
10
+ value: {
11
+ type: 'array',
12
+ value: []
13
+ },
14
+ placeholder: {
15
+ type: 'string',
16
+ value: 'Type something...'
17
+ },
18
+ readonly: {
19
+ type: 'boolean',
20
+ value: false
21
+ },
22
+ variant: {
23
+ type: 'array',
24
+ value: [],
25
+ options: ['compact', 'bordered']
26
+ },
27
+ _change: {
28
+ type: 'function'
29
+ }
30
+ },
31
+ render: function()
32
+ {
33
+ const addon = onetype.AddonGet('editor');
34
+
35
+ this.blocks = [];
36
+
37
+ this.getValue = () =>
38
+ {
39
+ return this.blocks.map(block => ({
40
+ type: block.type,
41
+ data: Object.assign({}, block.data),
42
+ children: block.children || []
43
+ }));
44
+ };
45
+
46
+ this.OnReady(() =>
47
+ {
48
+ if(this.value && this.value.length)
49
+ {
50
+ this.value.forEach(block =>
51
+ {
52
+ addon.Fn('block.add', this, block.type, null, Object.assign({}, block.data));
53
+ });
54
+ }
55
+ else
56
+ {
57
+ addon.Fn('block.add', this, 'paragraph', null, {});
58
+ }
59
+ });
60
+
61
+ return /* html */ `
62
+ <div :class="'ot-editor ' + variant.join(' ')">
63
+ <div class="ot-editor-blocks"></div>
64
+ <div class="ot-editor-placeholder">{{ placeholder }}</div>
65
+ </div>
66
+ `;
67
+ }
68
+ });
69
+ });
@@ -0,0 +1,21 @@
1
+ onetype.AddonReady('editor', (editor) =>
2
+ {
3
+ editor.ItemAdd({
4
+ id: 'paragraph',
5
+ icon: 'text_fields',
6
+ name: 'Text',
7
+ category: 'basic',
8
+ editable: true,
9
+ children: false,
10
+ config: {},
11
+ insert: function(data)
12
+ {
13
+ return '<p>' + (data.content || '') + '</p>';
14
+ },
15
+ update: function(data)
16
+ {
17
+ return '<p>' + (data.content || '') + '</p>';
18
+ },
19
+ remove: function(node) {}
20
+ });
21
+ });