jpf-mobx 1.0.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 (299) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +21 -0
  3. package/dist/controls/codeMirror/HtmlEditor/HtmlEditor.d.ts +0 -0
  4. package/dist/controls/codeMirror/HtmlEditor/HtmlEditor.js +1 -0
  5. package/dist/controls/codeMirror/HtmlEditor/HtmlEditor.js.map +1 -0
  6. package/dist/controls/codeMirror/JsonEditor/JsonEditor.d.ts +0 -0
  7. package/dist/controls/codeMirror/JsonEditor/JsonEditor.js +1 -0
  8. package/dist/controls/codeMirror/JsonEditor/JsonEditor.js.map +1 -0
  9. package/dist/controls/codeMirror/index.d.ts +0 -0
  10. package/dist/controls/codeMirror/index.js +1 -0
  11. package/dist/controls/codeMirror/index.js.map +1 -0
  12. package/dist/controls/custom/FileSelector/FileSelector.d.ts +0 -0
  13. package/dist/controls/custom/FileSelector/FileSelector.js +1 -0
  14. package/dist/controls/custom/FileSelector/FileSelector.js.map +1 -0
  15. package/dist/controls/custom/LabeledControl/LabeledControl.d.ts +15 -0
  16. package/dist/controls/custom/LabeledControl/LabeledControl.js +37 -0
  17. package/dist/controls/custom/LabeledControl/LabeledControl.js.map +1 -0
  18. package/dist/controls/custom/ListItem/ListItem.d.ts +0 -0
  19. package/dist/controls/custom/ListItem/ListItem.js +1 -0
  20. package/dist/controls/custom/ListItem/ListItem.js.map +1 -0
  21. package/dist/controls/custom/index.d.ts +1 -0
  22. package/dist/controls/custom/index.js +2 -0
  23. package/dist/controls/custom/index.js.map +1 -0
  24. package/dist/controls/html/Button/Button.d.ts +0 -0
  25. package/dist/controls/html/Button/Button.js +1 -0
  26. package/dist/controls/html/Button/Button.js.map +1 -0
  27. package/dist/controls/html/Div/Div.d.ts +14 -0
  28. package/dist/controls/html/Div/Div.js +25 -0
  29. package/dist/controls/html/Div/Div.js.map +1 -0
  30. package/dist/controls/html/Image/Image.d.ts +16 -0
  31. package/dist/controls/html/Image/Image.js +29 -0
  32. package/dist/controls/html/Image/Image.js.map +1 -0
  33. package/dist/controls/html/Input/Input.d.ts +0 -0
  34. package/dist/controls/html/Input/Input.js +1 -0
  35. package/dist/controls/html/Input/Input.js.map +1 -0
  36. package/dist/controls/html/Select/Select.d.ts +0 -0
  37. package/dist/controls/html/Select/Select.js +1 -0
  38. package/dist/controls/html/Select/Select.js.map +1 -0
  39. package/dist/controls/html/Span/Span.d.ts +11 -0
  40. package/dist/controls/html/Span/Span.js +23 -0
  41. package/dist/controls/html/Span/Span.js.map +1 -0
  42. package/dist/controls/html/index.d.ts +3 -0
  43. package/dist/controls/html/index.js +4 -0
  44. package/dist/controls/html/index.js.map +1 -0
  45. package/dist/controls/index.d.ts +6 -0
  46. package/dist/controls/index.js +7 -0
  47. package/dist/controls/index.js.map +1 -0
  48. package/dist/controls/jsonViewAwesome/index.d.ts +0 -0
  49. package/dist/controls/jsonViewAwesome/index.js +1 -0
  50. package/dist/controls/jsonViewAwesome/index.js.map +1 -0
  51. package/dist/controls/jsonViewAwesome/jsonFormatter/JsonFormatter.d.ts +0 -0
  52. package/dist/controls/jsonViewAwesome/jsonFormatter/JsonFormatter.js +1 -0
  53. package/dist/controls/jsonViewAwesome/jsonFormatter/JsonFormatter.js.map +1 -0
  54. package/dist/controls/kendo/Chart/Chart.d.ts +0 -0
  55. package/dist/controls/kendo/Chart/Chart.js +1 -0
  56. package/dist/controls/kendo/Chart/Chart.js.map +1 -0
  57. package/dist/controls/kendo/Culture/Culture.d.ts +1 -0
  58. package/dist/controls/kendo/Culture/Culture.js +26 -0
  59. package/dist/controls/kendo/Culture/Culture.js.map +1 -0
  60. package/dist/controls/kendo/DataSource/DataSource.d.ts +4 -0
  61. package/dist/controls/kendo/DataSource/DataSource.js +2 -0
  62. package/dist/controls/kendo/DataSource/DataSource.js.map +1 -0
  63. package/dist/controls/kendo/Dialog/Dialog.d.ts +0 -0
  64. package/dist/controls/kendo/Dialog/Dialog.js +1 -0
  65. package/dist/controls/kendo/Dialog/Dialog.js.map +1 -0
  66. package/dist/controls/kendo/Editor/Editor.d.ts +0 -0
  67. package/dist/controls/kendo/Editor/Editor.js +1 -0
  68. package/dist/controls/kendo/Editor/Editor.js.map +1 -0
  69. package/dist/controls/kendo/Grid/Grid.d.ts +0 -0
  70. package/dist/controls/kendo/Grid/Grid.js +1 -0
  71. package/dist/controls/kendo/Grid/Grid.js.map +1 -0
  72. package/dist/controls/kendo/Menu/Menu.d.ts +0 -0
  73. package/dist/controls/kendo/Menu/Menu.js +1 -0
  74. package/dist/controls/kendo/Menu/Menu.js.map +1 -0
  75. package/dist/controls/kendo/ObservableObject/ObservableObject.d.ts +0 -0
  76. package/dist/controls/kendo/ObservableObject/ObservableObject.js +1 -0
  77. package/dist/controls/kendo/ObservableObject/ObservableObject.js.map +1 -0
  78. package/dist/controls/kendo/Tree/Tree.d.ts +0 -0
  79. package/dist/controls/kendo/Tree/Tree.js +1 -0
  80. package/dist/controls/kendo/Tree/Tree.js.map +1 -0
  81. package/dist/controls/kendo/index.d.ts +0 -0
  82. package/dist/controls/kendo/index.js +1 -0
  83. package/dist/controls/kendo/index.js.map +1 -0
  84. package/dist/controls/leaflet/LabelControl/LabelControl.d.ts +12 -0
  85. package/dist/controls/leaflet/LabelControl/LabelControl.js +34 -0
  86. package/dist/controls/leaflet/LabelControl/LabelControl.js.map +1 -0
  87. package/dist/controls/leaflet/Map/Map.d.ts +0 -0
  88. package/dist/controls/leaflet/Map/Map.js +1 -0
  89. package/dist/controls/leaflet/Map/Map.js.map +1 -0
  90. package/dist/controls/leaflet/OpenStreetMapTileLayer/OpenStreetMapTileLayer.d.ts +8 -0
  91. package/dist/controls/leaflet/OpenStreetMapTileLayer/OpenStreetMapTileLayer.js +14 -0
  92. package/dist/controls/leaflet/OpenStreetMapTileLayer/OpenStreetMapTileLayer.js.map +1 -0
  93. package/dist/controls/leaflet/PointerEvent/PointerEvent.d.ts +2 -0
  94. package/dist/controls/leaflet/PointerEvent/PointerEvent.js +8 -0
  95. package/dist/controls/leaflet/PointerEvent/PointerEvent.js.map +1 -0
  96. package/dist/controls/leaflet/index.d.ts +3 -0
  97. package/dist/controls/leaflet/index.js +4 -0
  98. package/dist/controls/leaflet/index.js.map +1 -0
  99. package/dist/controls/svg/Circle/Circle.d.ts +0 -0
  100. package/dist/controls/svg/Circle/Circle.js +1 -0
  101. package/dist/controls/svg/Circle/Circle.js.map +1 -0
  102. package/dist/controls/svg/Ellipse/Ellipse.d.ts +0 -0
  103. package/dist/controls/svg/Ellipse/Ellipse.js +1 -0
  104. package/dist/controls/svg/Ellipse/Ellipse.js.map +1 -0
  105. package/dist/controls/svg/ForeignObject/ForeignObject.d.ts +0 -0
  106. package/dist/controls/svg/ForeignObject/ForeignObject.js +1 -0
  107. package/dist/controls/svg/ForeignObject/ForeignObject.js.map +1 -0
  108. package/dist/controls/svg/Group/Group.d.ts +0 -0
  109. package/dist/controls/svg/Group/Group.js +1 -0
  110. package/dist/controls/svg/Group/Group.js.map +1 -0
  111. package/dist/controls/svg/Line/Line.d.ts +0 -0
  112. package/dist/controls/svg/Line/Line.js +1 -0
  113. package/dist/controls/svg/Line/Line.js.map +1 -0
  114. package/dist/controls/svg/Pattern/Pattern.d.ts +0 -0
  115. package/dist/controls/svg/Pattern/Pattern.js +1 -0
  116. package/dist/controls/svg/Pattern/Pattern.js.map +1 -0
  117. package/dist/controls/svg/Polygon/Polygon.d.ts +0 -0
  118. package/dist/controls/svg/Polygon/Polygon.js +1 -0
  119. package/dist/controls/svg/Polygon/Polygon.js.map +1 -0
  120. package/dist/controls/svg/Polyline/Polyline.d.ts +0 -0
  121. package/dist/controls/svg/Polyline/Polyline.js +1 -0
  122. package/dist/controls/svg/Polyline/Polyline.js.map +1 -0
  123. package/dist/controls/svg/Rectangle/Rectangle.d.ts +0 -0
  124. package/dist/controls/svg/Rectangle/Rectangle.js +1 -0
  125. package/dist/controls/svg/Rectangle/Rectangle.js.map +1 -0
  126. package/dist/controls/svg/Svg/Svg.d.ts +0 -0
  127. package/dist/controls/svg/Svg/Svg.js +1 -0
  128. package/dist/controls/svg/Svg/Svg.js.map +1 -0
  129. package/dist/controls/svg/Text/Text.d.ts +0 -0
  130. package/dist/controls/svg/Text/Text.js +1 -0
  131. package/dist/controls/svg/Text/Text.js.map +1 -0
  132. package/dist/controls/svg/Title/Title.d.ts +0 -0
  133. package/dist/controls/svg/Title/Title.js +1 -0
  134. package/dist/controls/svg/Title/Title.js.map +1 -0
  135. package/dist/controls/svg/index.d.ts +0 -0
  136. package/dist/controls/svg/index.js +1 -0
  137. package/dist/controls/svg/index.js.map +1 -0
  138. package/dist/controls/svg/svg.d.ts +0 -0
  139. package/dist/controls/svg/svg.js +1 -0
  140. package/dist/controls/svg/svg.js.map +1 -0
  141. package/dist/framework/View.d.ts +62 -0
  142. package/dist/framework/View.js +148 -0
  143. package/dist/framework/View.js.map +1 -0
  144. package/dist/framework/ViewModel.d.ts +42 -0
  145. package/dist/framework/ViewModel.js +287 -0
  146. package/dist/framework/ViewModel.js.map +1 -0
  147. package/dist/framework/attributes.d.ts +90 -0
  148. package/dist/framework/attributes.js +2 -0
  149. package/dist/framework/attributes.js.map +1 -0
  150. package/dist/framework/event.d.ts +80 -0
  151. package/dist/framework/event.js +26 -0
  152. package/dist/framework/event.js.map +1 -0
  153. package/dist/framework/observable.d.ts +9 -0
  154. package/dist/framework/observable.js +24 -0
  155. package/dist/framework/observable.js.map +1 -0
  156. package/dist/framework/style.d.ts +658 -0
  157. package/dist/framework/style.js +154 -0
  158. package/dist/framework/style.js.map +1 -0
  159. package/dist/framework/types.d.ts +87 -0
  160. package/dist/framework/types.js +2 -0
  161. package/dist/framework/types.js.map +1 -0
  162. package/dist/framework/userAgent.d.ts +31 -0
  163. package/dist/framework/userAgent.js +47 -0
  164. package/dist/framework/userAgent.js.map +1 -0
  165. package/dist/index.d.ts +12 -0
  166. package/dist/index.js +13 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/utilities/blob/blob.d.ts +1 -0
  169. package/dist/utilities/blob/blob.js +18 -0
  170. package/dist/utilities/blob/blob.js.map +1 -0
  171. package/dist/utilities/cookie/cookie.d.ts +3 -0
  172. package/dist/utilities/cookie/cookie.js +27 -0
  173. package/dist/utilities/cookie/cookie.js.map +1 -0
  174. package/dist/utilities/dataReaderTable/dataReaderTable.d.ts +9 -0
  175. package/dist/utilities/dataReaderTable/dataReaderTable.js +24 -0
  176. package/dist/utilities/dataReaderTable/dataReaderTable.js.map +1 -0
  177. package/dist/utilities/fetch/fetch.d.ts +8 -0
  178. package/dist/utilities/fetch/fetch.js +138 -0
  179. package/dist/utilities/fetch/fetch.js.map +1 -0
  180. package/dist/utilities/float/float.d.ts +1 -0
  181. package/dist/utilities/float/float.js +4 -0
  182. package/dist/utilities/float/float.js.map +1 -0
  183. package/dist/utilities/formData/formData.d.ts +1 -0
  184. package/dist/utilities/formData/formData.js +12 -0
  185. package/dist/utilities/formData/formData.js.map +1 -0
  186. package/dist/utilities/html/html.d.ts +1 -0
  187. package/dist/utilities/html/html.js +8 -0
  188. package/dist/utilities/html/html.js.map +1 -0
  189. package/dist/utilities/htmlElement/htmlElement.d.ts +1 -0
  190. package/dist/utilities/htmlElement/htmlElement.js +17 -0
  191. package/dist/utilities/htmlElement/htmlElement.js.map +1 -0
  192. package/dist/utilities/image/image.d.ts +1 -0
  193. package/dist/utilities/image/image.js +2 -0
  194. package/dist/utilities/image/image.js.map +1 -0
  195. package/dist/utilities/index.d.ts +36 -0
  196. package/dist/utilities/index.js +37 -0
  197. package/dist/utilities/index.js.map +1 -0
  198. package/dist/utilities/integer/integer.d.ts +3 -0
  199. package/dist/utilities/integer/integer.js +28 -0
  200. package/dist/utilities/integer/integer.js.map +1 -0
  201. package/dist/utilities/key/key.d.ts +2 -0
  202. package/dist/utilities/key/key.js +7 -0
  203. package/dist/utilities/key/key.js.map +1 -0
  204. package/dist/utilities/navigator/navigator.d.ts +1 -0
  205. package/dist/utilities/navigator/navigator.js +9 -0
  206. package/dist/utilities/navigator/navigator.js.map +1 -0
  207. package/dist/utilities/notification/notification.d.ts +5 -0
  208. package/dist/utilities/notification/notification.js +67 -0
  209. package/dist/utilities/notification/notification.js.map +1 -0
  210. package/dist/utilities/querystring/querystring.d.ts +6 -0
  211. package/dist/utilities/querystring/querystring.js +54 -0
  212. package/dist/utilities/querystring/querystring.js.map +1 -0
  213. package/dist/utilities/router/router.d.ts +19 -0
  214. package/dist/utilities/router/router.js +81 -0
  215. package/dist/utilities/router/router.js.map +1 -0
  216. package/dist/utilities/stylesheet/stylesheet.d.ts +2 -0
  217. package/dist/utilities/stylesheet/stylesheet.js +48 -0
  218. package/dist/utilities/stylesheet/stylesheet.js.map +1 -0
  219. package/dist/utilities/uniqueId/uniqueId.d.ts +1 -0
  220. package/dist/utilities/uniqueId/uniqueId.js +5 -0
  221. package/dist/utilities/uniqueId/uniqueId.js.map +1 -0
  222. package/dist/utilities/webSocket/webSocket.d.ts +1 -0
  223. package/dist/utilities/webSocket/webSocket.js +55 -0
  224. package/dist/utilities/webSocket/webSocket.js.map +1 -0
  225. package/package.json +62 -0
  226. package/src/controls/codeMirror/HtmlEditor/HtmlEditor.ts +153 -0
  227. package/src/controls/codeMirror/JsonEditor/JsonEditor.ts +136 -0
  228. package/src/controls/codeMirror/index.ts +2 -0
  229. package/src/controls/custom/FileSelector/FileSelector.ts +74 -0
  230. package/src/controls/custom/LabeledControl/LabeledControl.ts +58 -0
  231. package/src/controls/custom/ListItem/ListItem.ts +99 -0
  232. package/src/controls/custom/index.ts +3 -0
  233. package/src/controls/html/Button/Button.ts +70 -0
  234. package/src/controls/html/Div/Div.ts +41 -0
  235. package/src/controls/html/Image/Image.ts +46 -0
  236. package/src/controls/html/Input/Input.ts +228 -0
  237. package/src/controls/html/Select/Select.ts +146 -0
  238. package/src/controls/html/Span/Span.ts +38 -0
  239. package/src/controls/html/index.ts +6 -0
  240. package/src/controls/index.ts +15 -0
  241. package/src/controls/jsonViewAwesome/index.ts +1 -0
  242. package/src/controls/jsonViewAwesome/jsonFormatter/JsonFormatter.ts +91 -0
  243. package/src/controls/kendo/Chart/Chart.ts +97 -0
  244. package/src/controls/kendo/Culture/Culture.ts +32 -0
  245. package/src/controls/kendo/DataSource/DataSource.ts +4 -0
  246. package/src/controls/kendo/Dialog/Dialog.ts +64 -0
  247. package/src/controls/kendo/Editor/Editor.ts +142 -0
  248. package/src/controls/kendo/Grid/Grid.ts +291 -0
  249. package/src/controls/kendo/Menu/Menu.ts +125 -0
  250. package/src/controls/kendo/ObservableObject/ObservableObject.ts +45 -0
  251. package/src/controls/kendo/Tree/Tree.ts +147 -0
  252. package/src/controls/kendo/index.ts +9 -0
  253. package/src/controls/leaflet/LabelControl/LabelControl.ts +42 -0
  254. package/src/controls/leaflet/Map/Map.ts +180 -0
  255. package/src/controls/leaflet/OpenStreetMapTileLayer/OpenStreetMapTileLayer.ts +19 -0
  256. package/src/controls/leaflet/PointerEvent/PointerEvent.ts +9 -0
  257. package/src/controls/leaflet/index.ts +4 -0
  258. package/src/controls/svg/Circle/Circle.ts +34 -0
  259. package/src/controls/svg/Ellipse/Ellipse.ts +36 -0
  260. package/src/controls/svg/ForeignObject/ForeignObject.ts +38 -0
  261. package/src/controls/svg/Group/Group.ts +38 -0
  262. package/src/controls/svg/Line/Line.ts +36 -0
  263. package/src/controls/svg/Pattern/Pattern.ts +49 -0
  264. package/src/controls/svg/Polygon/Polygon.ts +31 -0
  265. package/src/controls/svg/Polyline/Polyline.ts +31 -0
  266. package/src/controls/svg/Rectangle/Rectangle.ts +36 -0
  267. package/src/controls/svg/Svg/Svg.ts +43 -0
  268. package/src/controls/svg/Text/Text.ts +38 -0
  269. package/src/controls/svg/Title/Title.ts +28 -0
  270. package/src/controls/svg/index.ts +13 -0
  271. package/src/controls/svg/svg.ts +20 -0
  272. package/src/framework/View.ts +226 -0
  273. package/src/framework/ViewModel.ts +478 -0
  274. package/src/framework/attributes.ts +92 -0
  275. package/src/framework/event.ts +98 -0
  276. package/src/framework/observable.ts +40 -0
  277. package/src/framework/style.ts +3271 -0
  278. package/src/framework/types.ts +277 -0
  279. package/src/framework/userAgent.ts +51 -0
  280. package/src/index.ts +14 -0
  281. package/src/utilities/blob/blob.ts +19 -0
  282. package/src/utilities/cookie/cookie.ts +28 -0
  283. package/src/utilities/dataReaderTable/dataReaderTable.ts +34 -0
  284. package/src/utilities/fetch/fetch.ts +179 -0
  285. package/src/utilities/float/float.ts +3 -0
  286. package/src/utilities/formData/formData.ts +12 -0
  287. package/src/utilities/html/html.ts +8 -0
  288. package/src/utilities/htmlElement/htmlElement.ts +15 -0
  289. package/src/utilities/image/image.ts +1 -0
  290. package/src/utilities/index.ts +37 -0
  291. package/src/utilities/integer/integer.ts +31 -0
  292. package/src/utilities/key/key.ts +7 -0
  293. package/src/utilities/navigator/navigator.ts +7 -0
  294. package/src/utilities/notification/notification.ts +88 -0
  295. package/src/utilities/querystring/querystring.ts +61 -0
  296. package/src/utilities/router/router.ts +124 -0
  297. package/src/utilities/stylesheet/stylesheet.ts +58 -0
  298. package/src/utilities/uniqueId/uniqueId.ts +5 -0
  299. package/src/utilities/webSocket/webSocket.ts +72 -0
@@ -0,0 +1,13 @@
1
+ //export * from "./Circle/Circle";
2
+ //export * from "./Ellipse/Ellipse";
3
+ //export * from "./ForeignObject/ForeignObject";
4
+ //export * from "./Group/Group";
5
+ //export * from "./Line/Line";
6
+ //export * from "./Pattern/Pattern";
7
+ //export * from "./Polygon/Polygon";
8
+ //export * from "./Polyline/Polyline";
9
+ //export * from "./Rectangle/Rectangle";
10
+ //export * from "./Svg/Svg";
11
+ //export * from "./Text/Text";
12
+ //export * from "./Title/Title";
13
+ //export * from "./svg";
@@ -0,0 +1,20 @@
1
+ //import { Subscribable, isSubscribable, unwrap, computed } from "knockout";
2
+
3
+ //export interface SvgPoint {
4
+ // x: number;
5
+ // y: number;
6
+ //}
7
+
8
+ //export function serializePoints(points: Array<SvgPoint> | Subscribable<Array<SvgPoint>>): string | Subscribable<string> {
9
+ // if (points) {
10
+ // if (isSubscribable(points)) {
11
+ // return computed<string>(
12
+ // () => {
13
+ // return unwrap(points).map((point) => { return point.x + "," + point.y }).join(" ");
14
+ // }
15
+ // );
16
+ // }
17
+ // return unwrap(points).map((point) => { return point.x + "," + point.y }).join(" ");
18
+ // }
19
+ // return null;
20
+ //}
@@ -0,0 +1,226 @@
1
+ import "tocca";
2
+ import { Subscribable, unwrap, isSubscribable } from "./observable";
3
+ import { ViewModel, applyBindings as applyViewModelToElement } from "./ViewModel";
4
+ import { reaction, IReactionDisposer } from "mobx";
5
+
6
+ const htmlTags = {
7
+ a: true,
8
+ div: true,
9
+ img: true,
10
+ pre: true,
11
+ form: true,
12
+ span: true,
13
+ input: true,
14
+ button: true,
15
+ select: true,
16
+ textarea: true
17
+ }
18
+
19
+ const svgTags = {
20
+ g: true,
21
+ svg: true,
22
+ rect: true,
23
+ text: true,
24
+ line: true,
25
+ title: true,
26
+ circle: true,
27
+ pattern: true,
28
+ ellipse: true,
29
+ polygon: true,
30
+ polyline: true,
31
+ foreignObject: true
32
+ }
33
+
34
+ type TagName = keyof typeof htmlTags | keyof typeof svgTags;
35
+
36
+ const svgNamespace = "http://www.w3.org/2000/svg";
37
+
38
+ //#region View class
39
+ export interface IView {
40
+ render(): HTMLElement;
41
+ dispose(): void;
42
+ }
43
+
44
+ export interface ViewOptions<TProperties> {
45
+ tagName: TagName;
46
+ properties?: TProperties;
47
+ children?: Array<IView> | Subscribable<Array<IView>>;
48
+ }
49
+
50
+ export class View<TProperties = any> implements IView {
51
+ constructor(properties: ViewOptions<TProperties>) {
52
+ this.tagName = properties.tagName;
53
+ this.properties = properties.properties;
54
+ this.optionsChildren = properties.children;
55
+ this.children = unwrap(properties.children);
56
+ }
57
+
58
+ // #region Private members
59
+ private readonly tagName: TagName;
60
+ private readonly optionsChildren: Array<IView> | Subscribable<Array<IView>>;
61
+ private children = new Array<IView>();
62
+
63
+
64
+ private buildChildren() {
65
+ if (this.element && this.children && this.children.length > 0) {
66
+ //Create a documentFragment to reduce browser repaints
67
+ const documentFragment = document.createDocumentFragment();
68
+ this.children.forEach((childView) => {
69
+ documentFragment.appendChild(childView.render());
70
+ });
71
+
72
+ //Add the documentFragment to the dom
73
+ this.element.appendChild(documentFragment);
74
+ }
75
+ }
76
+ // #endregion
77
+
78
+ // #region Protected members
79
+ protected element: HTMLElement;
80
+ protected readonly properties: TProperties;
81
+ protected readonly disposers = new Array<IReactionDisposer>();
82
+
83
+ protected build(): void {
84
+ applyViewModelToElement(this.properties, this.element, this.disposers);
85
+
86
+ if (this.children) {
87
+ this.buildChildren();
88
+ }
89
+
90
+
91
+ //Find out if the options.Children are observable.
92
+ if (isSubscribable(this.optionsChildren)) {
93
+
94
+ this.disposers.push(
95
+ reaction(
96
+ () => unwrap(this.optionsChildren),
97
+ (children: IView[]) => {
98
+ this.setChildren(...children);
99
+ }
100
+ )
101
+ );
102
+
103
+ //this.subscriptions.push(
104
+ // this.optionsChildren.subscribe((children) => {
105
+ // this.setChildren(...children);
106
+ // })
107
+ //);
108
+ }
109
+ }
110
+
111
+ protected remove(): void {
112
+ if (this.element) {
113
+ if (this.element.remove) {
114
+ this.element.remove();
115
+ } else {
116
+ if (this.element.parentElement) {
117
+ this.element.parentElement.removeChild(this.element);
118
+ }
119
+ }
120
+
121
+ this.element = null;
122
+ }
123
+ }
124
+
125
+ protected addChild(child: IView): View<TProperties> {
126
+ this.children.push(child);
127
+ this.buildChildren();
128
+ return this;
129
+ }
130
+
131
+ protected setChildren(...children: Array<IView>): View<TProperties> {
132
+ this.empty();
133
+
134
+ this.children = children;
135
+ this.buildChildren();
136
+
137
+ return this;
138
+ }
139
+
140
+ protected empty(): void {
141
+ this.children = [];
142
+
143
+ if (this.element) {
144
+ this.element.innerHTML = "";
145
+ while (this.element.firstChild) {
146
+ this.element.removeChild(this.element.firstChild);
147
+ }
148
+ }
149
+ }
150
+ // #endregion
151
+
152
+ // #region Public members
153
+ render(): HTMLElement {
154
+ if (this.element) {
155
+ //If the element has already been rendered we remove the element from the dom
156
+ this.remove();
157
+ }
158
+
159
+ //Check if the build property is pointing to a function.
160
+ if (typeof this.build === "function") {
161
+ //Create the html element.
162
+ if (svgTags.hasOwnProperty(this.tagName)) {
163
+ //Create a SVGElement
164
+ this.element = document.createElementNS(svgNamespace, this.tagName) as any as HTMLElement;
165
+ } else {
166
+ //Create a HTMLElement
167
+ this.element = document.createElement(this.tagName);
168
+ }
169
+
170
+ //Build the UiElement
171
+ this.build();
172
+
173
+ //Return the fully functional html element
174
+ return this.element;
175
+ }
176
+
177
+ throw "The build method of this UiElement has not been defined";
178
+ }
179
+
180
+ dispose(): void {
181
+ for (let disposer of this.disposers) {
182
+ disposer();
183
+ }
184
+ for (let child of this.children) {
185
+ child.dispose();
186
+ }
187
+ }
188
+
189
+ focus(options?: FocusOptions) {
190
+ if (this.element) {
191
+ this.element.focus(options);
192
+ }
193
+ }
194
+ // #endregion
195
+ }
196
+ //#endregion
197
+
198
+ //#region View dictionary
199
+ var viewDictionary = new Map<any, any>();
200
+
201
+ export function registerView(viewModel: any, view: any) {
202
+ viewDictionary.set(viewModel.prototype.constructor, view);
203
+ }
204
+
205
+ export function getView(viewModel: ViewModel): View {
206
+ if (viewModel && viewModel.constructor) {
207
+ const view = viewDictionary.get(viewModel.constructor);
208
+ if (view.prototype) {
209
+ // ReSharper disable once InconsistentNaming
210
+ return new view(viewModel);
211
+ }
212
+ //if (typeof view === "function") {
213
+ // return view(viewModel);
214
+ //}
215
+ }
216
+ return null;
217
+ }
218
+
219
+ export function render(viewModel: ViewModel): HTMLElement {
220
+ const view = getView(viewModel);
221
+ if (view && view.render) {
222
+ return view.render();
223
+ }
224
+ return null;
225
+ }
226
+ //#endregion