@babylonjs/viewer 5.0.0-rc.2 → 5.0.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 (159) hide show
  1. package/configuration/configuration.d.ts +13 -13
  2. package/configuration/configuration.js +1 -1
  3. package/configuration/configuration.js.map +1 -1
  4. package/configuration/configurationCompatibility.d.ts +1 -1
  5. package/configuration/configurationCompatibility.js +2 -2
  6. package/configuration/configurationCompatibility.js.map +1 -1
  7. package/configuration/configurationContainer.d.ts +3 -3
  8. package/configuration/configurationContainer.js +1 -1
  9. package/configuration/configurationContainer.js.map +1 -1
  10. package/configuration/globals.d.ts +1 -1
  11. package/configuration/globals.js.map +1 -1
  12. package/configuration/index.d.ts +2 -2
  13. package/configuration/index.js +3 -2
  14. package/configuration/index.js.map +1 -1
  15. package/configuration/interfaces/cameraConfiguration.js.map +1 -1
  16. package/configuration/interfaces/colorGradingConfiguration.js.map +1 -1
  17. package/configuration/interfaces/defaultRenderingPipelineConfiguration.d.ts +1 -1
  18. package/configuration/interfaces/defaultRenderingPipelineConfiguration.js.map +1 -1
  19. package/configuration/interfaces/environmentMapConfiguration.js.map +1 -1
  20. package/configuration/interfaces/groundConfiguration.js.map +1 -1
  21. package/configuration/interfaces/imageProcessingConfiguration.js.map +1 -1
  22. package/configuration/interfaces/index.d.ts +15 -15
  23. package/configuration/interfaces/index.js +15 -15
  24. package/configuration/interfaces/index.js.map +1 -1
  25. package/configuration/interfaces/lightConfiguration.js.map +1 -1
  26. package/configuration/interfaces/modelAnimationConfiguration.js.map +1 -1
  27. package/configuration/interfaces/modelConfiguration.d.ts +1 -1
  28. package/configuration/interfaces/modelConfiguration.js.map +1 -1
  29. package/configuration/interfaces/observersConfiguration.js.map +1 -1
  30. package/configuration/interfaces/sceneConfiguration.d.ts +3 -3
  31. package/configuration/interfaces/sceneConfiguration.js.map +1 -1
  32. package/configuration/interfaces/sceneOptimizerConfiguration.js.map +1 -1
  33. package/configuration/interfaces/skyboxConfiguration.d.ts +1 -1
  34. package/configuration/interfaces/skyboxConfiguration.js.map +1 -1
  35. package/configuration/interfaces/templateConfiguration.js.map +1 -1
  36. package/configuration/interfaces/vrConfiguration.d.ts +1 -1
  37. package/configuration/interfaces/vrConfiguration.js.map +1 -1
  38. package/configuration/loader.js +3 -15
  39. package/configuration/loader.js.map +1 -1
  40. package/configuration/mappers.d.ts +3 -3
  41. package/configuration/mappers.js +13 -12
  42. package/configuration/mappers.js.map +1 -1
  43. package/configuration/renderOnlyLoader.d.ts +1 -1
  44. package/configuration/renderOnlyLoader.js +18 -15
  45. package/configuration/renderOnlyLoader.js.map +1 -1
  46. package/configuration/types/default.d.ts +2 -2
  47. package/configuration/types/default.js +37 -36
  48. package/configuration/types/default.js.map +1 -1
  49. package/configuration/types/environmentMap.d.ts +1 -1
  50. package/configuration/types/environmentMap.js +5 -5
  51. package/configuration/types/environmentMap.js.map +1 -1
  52. package/configuration/types/extended.d.ts +2 -2
  53. package/configuration/types/extended.js +49 -49
  54. package/configuration/types/extended.js.map +1 -1
  55. package/configuration/types/index.d.ts +4 -4
  56. package/configuration/types/index.js +14 -13
  57. package/configuration/types/index.js.map +1 -1
  58. package/configuration/types/minimal.d.ts +2 -2
  59. package/configuration/types/minimal.js +12 -12
  60. package/configuration/types/minimal.js.map +1 -1
  61. package/configuration/types/renderOnlyDefault.d.ts +1 -1
  62. package/configuration/types/renderOnlyDefault.js +8 -8
  63. package/configuration/types/renderOnlyDefault.js.map +1 -1
  64. package/configuration/types/shadowLight.d.ts +1 -1
  65. package/configuration/types/shadowLight.js +12 -12
  66. package/configuration/types/shadowLight.js.map +1 -1
  67. package/helper/index.d.ts +3 -3
  68. package/helper/index.js +14 -8
  69. package/helper/index.js.map +1 -1
  70. package/index.d.ts +20 -20
  71. package/index.js +22 -18
  72. package/index.js.map +1 -1
  73. package/initializer.js +8 -7
  74. package/initializer.js.map +1 -1
  75. package/interfaces.js.map +1 -1
  76. package/labs/environmentSerializer.d.ts +6 -6
  77. package/labs/environmentSerializer.js +18 -14
  78. package/labs/environmentSerializer.js.map +1 -1
  79. package/labs/texture.d.ts +7 -8
  80. package/labs/texture.js +30 -27
  81. package/labs/texture.js.map +1 -1
  82. package/labs/viewerLabs.d.ts +11 -11
  83. package/labs/viewerLabs.js +9 -7
  84. package/labs/viewerLabs.js.map +1 -1
  85. package/license.md +71 -0
  86. package/loader/modelLoader.d.ts +10 -7
  87. package/loader/modelLoader.js +26 -19
  88. package/loader/modelLoader.js.map +1 -1
  89. package/loader/plugins/applyMaterialConfig.d.ts +4 -4
  90. package/loader/plugins/applyMaterialConfig.js.map +1 -1
  91. package/loader/plugins/extendedMaterialLoaderPlugin.d.ts +2 -2
  92. package/loader/plugins/extendedMaterialLoaderPlugin.js +1 -1
  93. package/loader/plugins/extendedMaterialLoaderPlugin.js.map +1 -1
  94. package/loader/plugins/index.d.ts +5 -4
  95. package/loader/plugins/index.js +9 -8
  96. package/loader/plugins/index.js.map +1 -1
  97. package/loader/plugins/loaderPlugin.d.ts +7 -7
  98. package/loader/plugins/loaderPlugin.js.map +1 -1
  99. package/loader/plugins/msftLodLoaderPlugin.d.ts +5 -5
  100. package/loader/plugins/msftLodLoaderPlugin.js +2 -1
  101. package/loader/plugins/msftLodLoaderPlugin.js.map +1 -1
  102. package/loader/plugins/telemetryLoaderPlugin.d.ts +4 -4
  103. package/loader/plugins/telemetryLoaderPlugin.js +4 -4
  104. package/loader/plugins/telemetryLoaderPlugin.js.map +1 -1
  105. package/managers/observablesManager.d.ts +6 -6
  106. package/managers/observablesManager.js +1 -1
  107. package/managers/observablesManager.js.map +1 -1
  108. package/managers/sceneManager.d.ts +28 -30
  109. package/managers/sceneManager.js +96 -95
  110. package/managers/sceneManager.js.map +1 -1
  111. package/managers/telemetryManager.d.ts +6 -6
  112. package/managers/telemetryManager.js +6 -6
  113. package/managers/telemetryManager.js.map +1 -1
  114. package/model/modelAnimation.d.ts +14 -14
  115. package/model/modelAnimation.js +3 -3
  116. package/model/modelAnimation.js.map +1 -1
  117. package/model/viewerModel.d.ts +23 -31
  118. package/model/viewerModel.js +51 -46
  119. package/model/viewerModel.js.map +1 -1
  120. package/optimizer/custom/extended.d.ts +3 -5
  121. package/optimizer/custom/extended.js +3 -5
  122. package/optimizer/custom/extended.js.map +1 -1
  123. package/optimizer/custom/index.d.ts +1 -1
  124. package/optimizer/custom/index.js +1 -1
  125. package/optimizer/custom/index.js.map +1 -1
  126. package/package.json +41 -215
  127. package/readme.md +12 -8
  128. package/renderOnlyIndex.d.ts +10 -10
  129. package/renderOnlyIndex.js +6 -4
  130. package/renderOnlyIndex.js.map +1 -1
  131. package/templating/eventManager.d.ts +1 -1
  132. package/templating/eventManager.js +4 -2
  133. package/templating/eventManager.js.map +1 -1
  134. package/templating/plugins/hdButtonPlugin.d.ts +2 -2
  135. package/templating/plugins/hdButtonPlugin.js +2 -15
  136. package/templating/plugins/hdButtonPlugin.js.map +1 -1
  137. package/templating/plugins/printButton.d.ts +2 -3
  138. package/templating/plugins/printButton.js +3 -16
  139. package/templating/plugins/printButton.js.map +1 -1
  140. package/templating/templateManager.d.ts +8 -7
  141. package/templating/templateManager.js +72 -62
  142. package/templating/templateManager.js.map +1 -1
  143. package/templating/viewerTemplatePlugin.d.ts +1 -1
  144. package/templating/viewerTemplatePlugin.js +4 -4
  145. package/templating/viewerTemplatePlugin.js.map +1 -1
  146. package/viewer/defaultViewer.d.ts +17 -11
  147. package/viewer/defaultViewer.js +116 -121
  148. package/viewer/defaultViewer.js.map +1 -1
  149. package/viewer/renderOnlyViewer.d.ts +2 -2
  150. package/viewer/renderOnlyViewer.js +17 -24
  151. package/viewer/renderOnlyViewer.js.map +1 -1
  152. package/viewer/viewer.d.ts +19 -18
  153. package/viewer/viewer.js +63 -49
  154. package/viewer/viewer.js.map +1 -1
  155. package/viewer/viewerManager.d.ts +5 -5
  156. package/viewer/viewerManager.js +4 -3
  157. package/viewer/viewerManager.js.map +1 -1
  158. package/viewer/viewerWithTemplate.js +2 -15
  159. package/viewer/viewerWithTemplate.js.map +1 -1
@@ -1,8 +1,9 @@
1
- import { Observable } from '@babylonjs/core/Misc/observable.js';
2
- import { Tools } from '@babylonjs/core/Misc/tools.js';
3
- import { isUrl, camelToKebab, kebabToCamel, deepmerge } from '../helper/index.js';
4
- import * as Handlebars from 'handlebars/dist/handlebars';
5
- import { EventManager } from './eventManager.js';
1
+ import { Observable } from "@babylonjs/core/Misc/observable.js";
2
+ import { Tools } from "@babylonjs/core/Misc/tools.js";
3
+ // eslint-disable-next-line import/no-internal-modules
4
+ import { isUrl, camelToKebab, kebabToCamel, deepmerge } from "../helper/index.js";
5
+ import * as Handlebars from "handlebars";
6
+ import { EventManager } from "./eventManager.js";
6
7
  /**
7
8
  * The template manager, a member of the viewer class, will manage the viewer's templates and generate the HTML.
8
9
  * The template manager managers a single viewer and can be seen as the collection of all sub-templates of the viewer.
@@ -10,7 +11,7 @@ import { EventManager } from './eventManager.js';
10
11
  var TemplateManager = /** @class */ (function () {
11
12
  function TemplateManager(containerElement) {
12
13
  this.containerElement = containerElement;
13
- this.templates = {};
14
+ this._templates = {};
14
15
  this.onTemplateInit = new Observable();
15
16
  this.onTemplateLoaded = new Observable();
16
17
  this.onTemplateStateChange = new Observable();
@@ -26,8 +27,9 @@ var TemplateManager = /** @class */ (function () {
26
27
  var _this = this;
27
28
  var internalInit = function (dependencyMap, name, parentTemplate) {
28
29
  //init template
29
- var template = _this.templates[name];
30
- var childrenTemplates = Object.keys(dependencyMap).map(function (childName) {
30
+ var template = _this._templates[name];
31
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
32
+ Object.keys(dependencyMap).map(function (childName) {
31
33
  return internalInit(dependencyMap[childName], childName, template);
32
34
  });
33
35
  // register the observers
@@ -51,8 +53,8 @@ var TemplateManager = /** @class */ (function () {
51
53
  };
52
54
  //build the html tree
53
55
  return this._buildHTMLTree(templates).then(function (htmlTree) {
54
- if (_this.templates['main']) {
55
- internalInit(htmlTree, 'main');
56
+ if (_this._templates["main"]) {
57
+ internalInit(htmlTree, "main");
56
58
  }
57
59
  else {
58
60
  _this._checkLoadedState();
@@ -86,21 +88,21 @@ var TemplateManager = /** @class */ (function () {
86
88
  _this.onTemplateInit.notifyObservers(template);
87
89
  // make sure the global onEventTriggered is called as well
88
90
  template.onEventTriggered.add(function (eventData) { return _this.onEventTriggered.notifyObservers(eventData); });
89
- _this.templates[name] = template;
91
+ _this._templates[name] = template;
90
92
  return template.initPromise;
91
93
  });
92
94
  return Promise.all(promises).then(function () {
93
95
  var templateStructure = {};
94
96
  // now iterate through all templates and check for children:
95
97
  var buildTree = function (parentObject, name) {
96
- _this.templates[name].isInHtmlTree = true;
97
- var childNodes = _this.templates[name].getChildElements().filter(function (n) { return !!_this.templates[n]; });
98
+ _this._templates[name].isInHtmlTree = true;
99
+ var childNodes = _this._templates[name].getChildElements().filter(function (n) { return !!_this._templates[n]; });
98
100
  childNodes.forEach(function (element) {
99
101
  parentObject[element] = {};
100
102
  buildTree(parentObject[element], element);
101
103
  });
102
104
  };
103
- if (_this.templates['main']) {
105
+ if (_this._templates["main"]) {
104
106
  buildTree(templateStructure, "main");
105
107
  }
106
108
  return templateStructure;
@@ -111,20 +113,21 @@ var TemplateManager = /** @class */ (function () {
111
113
  * There must be one and only one canvas inthe template.
112
114
  */
113
115
  TemplateManager.prototype.getCanvas = function () {
114
- return this.containerElement.querySelector('canvas');
116
+ return this.containerElement.querySelector("canvas");
115
117
  };
116
118
  /**
117
119
  * Get a specific template from the template tree
118
120
  * @param name the name of the template to load
119
121
  */
120
122
  TemplateManager.prototype.getTemplate = function (name) {
121
- return this.templates[name];
123
+ return this._templates[name];
122
124
  };
123
125
  TemplateManager.prototype._checkLoadedState = function () {
124
126
  var _this = this;
125
- var done = Object.keys(this.templates).length === 0 || Object.keys(this.templates).every(function (key) {
126
- return (_this.templates[key].isLoaded && !!_this.templates[key].parent) || !_this.templates[key].isInHtmlTree;
127
- });
127
+ var done = Object.keys(this._templates).length === 0 ||
128
+ Object.keys(this._templates).every(function (key) {
129
+ return (_this._templates[key].isLoaded && !!_this._templates[key].parent) || !_this._templates[key].isInHtmlTree;
130
+ });
128
131
  if (done) {
129
132
  this.onAllLoaded.notifyObservers(this);
130
133
  }
@@ -135,10 +138,10 @@ var TemplateManager = /** @class */ (function () {
135
138
  TemplateManager.prototype.dispose = function () {
136
139
  var _this = this;
137
140
  // dispose all templates
138
- Object.keys(this.templates).forEach(function (template) {
139
- _this.templates[template].dispose();
141
+ Object.keys(this._templates).forEach(function (template) {
142
+ _this._templates[template].dispose();
140
143
  });
141
- this.templates = {};
144
+ this._templates = {};
142
145
  this.eventManager.dispose();
143
146
  this.onTemplateInit.clear();
144
147
  this.onAllLoaded.clear();
@@ -150,11 +153,11 @@ var TemplateManager = /** @class */ (function () {
150
153
  }());
151
154
  export { TemplateManager };
152
155
  // register a new helper. modified https://stackoverflow.com/questions/9838925/is-there-any-method-to-iterate-a-map-with-handlebars-js
153
- Handlebars.registerHelper('eachInMap', function (map, block) {
154
- var out = '';
156
+ Handlebars.registerHelper("eachInMap", function (map, block) {
157
+ var out = "";
155
158
  Object.keys(map).map(function (prop) {
156
159
  var data = map[prop];
157
- if (typeof data === 'object') {
160
+ if (typeof data === "object") {
158
161
  data.id = data.id || prop;
159
162
  out += block.fn(data);
160
163
  }
@@ -164,26 +167,26 @@ Handlebars.registerHelper('eachInMap', function (map, block) {
164
167
  });
165
168
  return out;
166
169
  });
167
- Handlebars.registerHelper('add', function (a, b) {
170
+ Handlebars.registerHelper("add", function (a, b) {
168
171
  var out = a + b;
169
172
  return out;
170
173
  });
171
- Handlebars.registerHelper('eq', function (a, b) {
172
- var out = (a == b);
174
+ Handlebars.registerHelper("eq", function (a, b) {
175
+ var out = a == b;
173
176
  return out;
174
177
  });
175
- Handlebars.registerHelper('or', function (a, b) {
178
+ Handlebars.registerHelper("or", function (a, b) {
176
179
  var out = a || b;
177
180
  return out;
178
181
  });
179
- Handlebars.registerHelper('not', function (a) {
182
+ Handlebars.registerHelper("not", function (a) {
180
183
  var out = !a;
181
184
  return out;
182
185
  });
183
- Handlebars.registerHelper('count', function (map) {
186
+ Handlebars.registerHelper("count", function (map) {
184
187
  return map.length;
185
188
  });
186
- Handlebars.registerHelper('gt', function (a, b) {
189
+ Handlebars.registerHelper("gt", function (a, b) {
187
190
  var out = a > b;
188
191
  return out;
189
192
  });
@@ -206,7 +209,7 @@ var Template = /** @class */ (function () {
206
209
  this.onEventTriggered = new Observable();
207
210
  this.onParamsUpdated = new Observable();
208
211
  this.onHTMLRendered = new Observable();
209
- this.loadRequests = [];
212
+ this._loadRequests = [];
210
213
  this.isLoaded = false;
211
214
  this.isShown = false;
212
215
  this.isInHtmlTree = false;
@@ -214,7 +217,7 @@ var Template = /** @class */ (function () {
214
217
  this.initPromise = htmlContentPromise.then(function (htmlTemplate) {
215
218
  if (htmlTemplate) {
216
219
  _this._htmlTemplate = htmlTemplate;
217
- var compiledTemplate = Handlebars.compile(htmlTemplate, { noEscape: (_this._configuration.params && !!_this._configuration.params.noEscape) });
220
+ var compiledTemplate = Handlebars.compile(htmlTemplate, { noEscape: _this._configuration.params && !!_this._configuration.params.noEscape });
218
221
  var config = _this._configuration.params || {};
219
222
  _this._rawHtml = compiledTemplate(config);
220
223
  try {
@@ -240,6 +243,7 @@ var Template = /** @class */ (function () {
240
243
  * Note that when updating parameters the events will be registered again (after being cleared).
241
244
  *
242
245
  * @param params the new template parameters
246
+ * @param append
243
247
  */
244
248
  Template.prototype.updateParams = function (params, append) {
245
249
  if (append === void 0) { append = true; }
@@ -292,12 +296,12 @@ var Template = /** @class */ (function () {
292
296
  if (!this._fragment) {
293
297
  var fragment = this.parent.querySelector(this.name);
294
298
  if (fragment) {
295
- children = fragment.querySelectorAll('*');
299
+ children = fragment.querySelectorAll("*");
296
300
  }
297
301
  }
298
302
  if (!children) {
299
303
  // casting to HTMLCollection, as both NodeListOf and HTMLCollection have 'item()' and 'length'.
300
- children = this._fragment.querySelectorAll('*');
304
+ children = this._fragment.querySelectorAll("*");
301
305
  }
302
306
  for (var i = 0; i < children.length; ++i) {
303
307
  var child = children.item(i);
@@ -320,7 +324,7 @@ var Template = /** @class */ (function () {
320
324
  /*let fragement = this.parent.querySelector(this.name)
321
325
  if (fragement)
322
326
  this.parent.removeChild(fragement);*/
323
- this.parent.innerHTML = '';
327
+ this.parent.innerHTML = "";
324
328
  }
325
329
  else {
326
330
  return;
@@ -346,7 +350,7 @@ var Template = /** @class */ (function () {
346
350
  };
347
351
  /**
348
352
  * Show the template using the provided visibilityFunction, or natively using display: flex.
349
- * The provided function returns a promise that should be fullfilled when the element is shown.
353
+ * The provided function returns a promise that should be fulfilled when the element is shown.
350
354
  * Since it is a promise async operations are more than possible.
351
355
  * See the default viewer for an opacity example.
352
356
  * @param visibilityFunction The function to execute to show the template.
@@ -356,21 +360,23 @@ var Template = /** @class */ (function () {
356
360
  if (this._isHiding) {
357
361
  return Promise.resolve(this);
358
362
  }
359
- return Promise.resolve().then(function () {
363
+ return Promise.resolve()
364
+ .then(function () {
360
365
  _this._isShowing = true;
361
366
  if (visibilityFunction) {
362
367
  return visibilityFunction(_this);
363
368
  }
364
369
  else {
365
370
  // flex? box? should this be configurable easier than the visibilityFunction?
366
- _this.parent.style.display = 'flex';
371
+ _this.parent.style.display = "flex";
367
372
  // support old browsers with no flex:
368
- if (_this.parent.style.display !== 'flex') {
369
- _this.parent.style.display = '';
373
+ if (_this.parent.style.display !== "flex") {
374
+ _this.parent.style.display = "";
370
375
  }
371
376
  return _this;
372
377
  }
373
- }).then(function () {
378
+ })
379
+ .then(function () {
374
380
  _this.isShown = true;
375
381
  _this._isShowing = false;
376
382
  _this.onStateChange.notifyObservers(_this);
@@ -379,7 +385,7 @@ var Template = /** @class */ (function () {
379
385
  };
380
386
  /**
381
387
  * Hide the template using the provided visibilityFunction, or natively using display: none.
382
- * The provided function returns a promise that should be fullfilled when the element is hidden.
388
+ * The provided function returns a promise that should be fulfilled when the element is hidden.
383
389
  * Since it is a promise async operations are more than possible.
384
390
  * See the default viewer for an opacity example.
385
391
  * @param visibilityFunction The function to execute to show the template.
@@ -389,17 +395,19 @@ var Template = /** @class */ (function () {
389
395
  if (this._isShowing) {
390
396
  return Promise.resolve(this);
391
397
  }
392
- return Promise.resolve().then(function () {
398
+ return Promise.resolve()
399
+ .then(function () {
393
400
  _this._isHiding = true;
394
401
  if (visibilityFunction) {
395
402
  return visibilityFunction(_this);
396
403
  }
397
404
  else {
398
405
  // flex? box? should this be configurable easier than the visibilityFunction?
399
- _this.parent.style.display = 'none';
406
+ _this.parent.style.display = "none";
400
407
  return _this;
401
408
  }
402
- }).then(function () {
409
+ })
410
+ .then(function () {
403
411
  _this.isShown = false;
404
412
  _this._isHiding = false;
405
413
  _this.onStateChange.notifyObservers(_this);
@@ -422,7 +430,7 @@ var Template = /** @class */ (function () {
422
430
  catch (e) {
423
431
  //noop
424
432
  }
425
- this.loadRequests.forEach(function (request) {
433
+ this._loadRequests.forEach(function (request) {
426
434
  request.abort();
427
435
  });
428
436
  if (this._registeredEvents) {
@@ -434,7 +442,7 @@ var Template = /** @class */ (function () {
434
442
  Template.prototype._getTemplateAsHtml = function (templateConfig) {
435
443
  var _this = this;
436
444
  if (!templateConfig) {
437
- return Promise.reject('No templateConfig provided');
445
+ return Promise.reject("No templateConfig provided");
438
446
  }
439
447
  else if (templateConfig.html && !templateConfig.location) {
440
448
  return Promise.resolve(templateConfig.html);
@@ -448,17 +456,17 @@ var Template = /** @class */ (function () {
448
456
  }, undefined, undefined, false, function (request, error) {
449
457
  reject(error);
450
458
  });
451
- _this.loadRequests.push(fileRequest);
459
+ _this._loadRequests.push(fileRequest);
452
460
  });
453
461
  }
454
462
  else {
455
- location_1 = location_1.replace('#', '');
463
+ location_1 = location_1.replace("#", "");
456
464
  var element = document.getElementById(location_1);
457
465
  if (element) {
458
466
  return Promise.resolve(element.innerHTML);
459
467
  }
460
468
  else {
461
- return Promise.reject('Template ID not found');
469
+ return Promise.reject("Template ID not found");
462
470
  }
463
471
  }
464
472
  }
@@ -479,10 +487,10 @@ var Template = /** @class */ (function () {
479
487
  _this.onEventTriggered.notifyObservers({ event: event, template: _this, selector: selector });
480
488
  };
481
489
  // if boolean, set the parent as the event listener
482
- if (typeof this_1._configuration.events[eventName] === 'boolean') {
490
+ if (typeof this_1._configuration.events[eventName] === "boolean") {
483
491
  var selector = this_1.parent.id;
484
492
  if (selector) {
485
- selector = '#' + selector;
493
+ selector = "#" + selector;
486
494
  }
487
495
  else {
488
496
  selector = this_1.parent.tagName;
@@ -492,19 +500,21 @@ var Template = /** @class */ (function () {
492
500
  this_1._registeredEvents.push({
493
501
  htmlElement: this_1.parent,
494
502
  eventName: eventName,
495
- function: binding
503
+ function: binding,
496
504
  });
497
505
  }
498
- else if (typeof this_1._configuration.events[eventName] === 'object') {
506
+ else if (typeof this_1._configuration.events[eventName] === "object") {
499
507
  var selectorsArray = Object.keys(this_1._configuration.events[eventName] || {});
500
- // strict null checl is working incorrectly, must override:
508
+ // strict null check is working incorrectly, must override:
501
509
  var event_1 = this_1._configuration.events[eventName] || {};
502
- selectorsArray.filter(function (selector) { return event_1[selector]; }).forEach(function (selector) {
510
+ selectorsArray
511
+ .filter(function (selector) { return typeof event_1 !== "boolean" && event_1[selector]; })
512
+ .forEach(function (selector) {
503
513
  var htmlElement = _this.parent.querySelector(selector);
504
514
  if (!htmlElement) {
505
515
  // backcompat, fallback to id
506
- if (selector && selector.indexOf('#') !== 0) {
507
- selector = '#' + selector;
516
+ if (selector && selector.indexOf("#") !== 0) {
517
+ selector = "#" + selector;
508
518
  }
509
519
  try {
510
520
  htmlElement = _this.parent.querySelector(selector);
@@ -517,7 +527,7 @@ var Template = /** @class */ (function () {
517
527
  _this._registeredEvents.push({
518
528
  htmlElement: htmlElement,
519
529
  eventName: eventName,
520
- function: binding
530
+ function: binding,
521
531
  });
522
532
  }
523
533
  });
@@ -531,7 +541,7 @@ var Template = /** @class */ (function () {
531
541
  }
532
542
  };
533
543
  Template.prototype._getTemplateLocation = function (templateConfig) {
534
- if (!templateConfig || typeof templateConfig === 'string') {
544
+ if (!templateConfig || typeof templateConfig === "string") {
535
545
  return templateConfig;
536
546
  }
537
547
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"templateManager.js","sourceRoot":"","sources":["../../../../sourceES6/viewer/src/templating/templateManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from '@babylonjs/core/Misc/observable';\r\nimport { Tools } from '@babylonjs/core/Misc/tools';\r\nimport { isUrl, camelToKebab, kebabToCamel, deepmerge } from '../helper/index';\r\n\r\nimport * as Handlebars from 'handlebars/dist/handlebars';\r\nimport { EventManager } from './eventManager';\r\nimport { ITemplateConfiguration } from '../configuration/interfaces/templateConfiguration';\r\nimport { IFileRequest } from '@babylonjs/core/Misc/fileRequest';\r\n\r\n/**\r\n * The object sent when an event is triggered\r\n */\r\nexport interface EventCallback {\r\n event: Event;\r\n template: Template;\r\n selector: string;\r\n payload?: any;\r\n}\r\n\r\n/**\r\n * The template manager, a member of the viewer class, will manage the viewer's templates and generate the HTML.\r\n * The template manager managers a single viewer and can be seen as the collection of all sub-templates of the viewer.\r\n */\r\nexport class TemplateManager {\r\n\r\n /**\r\n * Will be triggered when any template is initialized\r\n */\r\n public onTemplateInit: Observable<Template>;\r\n /**\r\n * Will be triggered when any template is fully loaded\r\n */\r\n public onTemplateLoaded: Observable<Template>;\r\n /**\r\n * Will be triggered when a template state changes\r\n */\r\n public onTemplateStateChange: Observable<Template>;\r\n /**\r\n * Will be triggered when all templates finished loading\r\n */\r\n public onAllLoaded: Observable<TemplateManager>;\r\n /**\r\n * Will be triggered when any event on any template is triggered.\r\n */\r\n public onEventTriggered: Observable<EventCallback>;\r\n\r\n /**\r\n * This template manager's event manager. In charge of callback registrations to native event types\r\n */\r\n public eventManager: EventManager;\r\n\r\n private templates: { [name: string]: Template };\r\n\r\n constructor(public containerElement: Element) {\r\n this.templates = {};\r\n\r\n this.onTemplateInit = new Observable<Template>();\r\n this.onTemplateLoaded = new Observable<Template>();\r\n this.onTemplateStateChange = new Observable<Template>();\r\n this.onAllLoaded = new Observable<TemplateManager>();\r\n this.onEventTriggered = new Observable<EventCallback>();\r\n\r\n this.eventManager = new EventManager(this);\r\n }\r\n\r\n /**\r\n * Initialize the template(s) for the viewer. Called bay the Viewer class\r\n * @param templates the templates to be used to initialize the main template\r\n */\r\n public initTemplate(templates: { [key: string]: ITemplateConfiguration }) {\r\n\r\n let internalInit = (dependencyMap, name: string, parentTemplate?: Template) => {\r\n //init template\r\n let template = this.templates[name];\r\n\r\n let childrenTemplates = Object.keys(dependencyMap).map((childName) => {\r\n return internalInit(dependencyMap[childName], childName, template);\r\n });\r\n\r\n // register the observers\r\n //template.onLoaded.add(() => {\r\n let addToParent = () => {\r\n let lastElements = parentTemplate && parentTemplate.parent.querySelectorAll(camelToKebab(name));\r\n let containingElement = (lastElements && lastElements.length && lastElements.item(lastElements.length - 1)) || this.containerElement;\r\n template.appendTo(<HTMLElement>containingElement);\r\n this._checkLoadedState();\r\n };\r\n\r\n if (parentTemplate && !parentTemplate.parent) {\r\n parentTemplate.onAppended.add(() => {\r\n addToParent();\r\n });\r\n } else {\r\n addToParent();\r\n }\r\n //});\r\n\r\n return template;\r\n };\r\n\r\n //build the html tree\r\n return this._buildHTMLTree(templates).then((htmlTree) => {\r\n if (this.templates['main']) {\r\n internalInit(htmlTree, 'main');\r\n } else {\r\n this._checkLoadedState();\r\n }\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * This function will create a simple map with child-dependencies of the template html tree.\r\n * It will compile each template, check if its children exist in the configuration and will add them if they do.\r\n * It is expected that the main template will be called main!\r\n *\r\n * @param templates\r\n */\r\n private _buildHTMLTree(templates: { [key: string]: ITemplateConfiguration }): Promise<object> {\r\n let promises: Array<Promise<Template | boolean>> = Object.keys(templates).map((name) => {\r\n // if the template was overridden\r\n if (!templates[name]) { return Promise.resolve(false); }\r\n // else - we have a template, let's do our job!\r\n let template = new Template(name, templates[name]);\r\n template.onLoaded.add(() => {\r\n this.onTemplateLoaded.notifyObservers(template);\r\n });\r\n template.onStateChange.add(() => {\r\n this.onTemplateStateChange.notifyObservers(template);\r\n });\r\n this.onTemplateInit.notifyObservers(template);\r\n // make sure the global onEventTriggered is called as well\r\n template.onEventTriggered.add((eventData) => this.onEventTriggered.notifyObservers(eventData));\r\n this.templates[name] = template;\r\n return template.initPromise;\r\n });\r\n\r\n return Promise.all(promises).then(() => {\r\n let templateStructure = {};\r\n // now iterate through all templates and check for children:\r\n let buildTree = (parentObject, name) => {\r\n this.templates[name].isInHtmlTree = true;\r\n let childNodes = this.templates[name].getChildElements().filter((n) => !!this.templates[n]);\r\n childNodes.forEach((element) => {\r\n parentObject[element] = {};\r\n buildTree(parentObject[element], element);\r\n });\r\n };\r\n if (this.templates['main']) {\r\n buildTree(templateStructure, \"main\");\r\n }\r\n return templateStructure;\r\n });\r\n }\r\n\r\n /**\r\n * Get the canvas in the template tree.\r\n * There must be one and only one canvas inthe template.\r\n */\r\n public getCanvas(): HTMLCanvasElement | null {\r\n return this.containerElement.querySelector('canvas');\r\n }\r\n\r\n /**\r\n * Get a specific template from the template tree\r\n * @param name the name of the template to load\r\n */\r\n public getTemplate(name: string): Template | undefined {\r\n return this.templates[name];\r\n }\r\n\r\n private _checkLoadedState() {\r\n let done = Object.keys(this.templates).length === 0 || Object.keys(this.templates).every((key) => {\r\n return (this.templates[key].isLoaded && !!this.templates[key].parent) || !this.templates[key].isInHtmlTree;\r\n });\r\n\r\n if (done) {\r\n this.onAllLoaded.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the template manager\r\n */\r\n public dispose() {\r\n // dispose all templates\r\n Object.keys(this.templates).forEach((template) => {\r\n this.templates[template].dispose();\r\n });\r\n this.templates = {};\r\n this.eventManager.dispose();\r\n\r\n this.onTemplateInit.clear();\r\n this.onAllLoaded.clear();\r\n this.onEventTriggered.clear();\r\n this.onTemplateLoaded.clear();\r\n this.onTemplateStateChange.clear();\r\n }\r\n\r\n}\r\n\r\n// register a new helper. modified https://stackoverflow.com/questions/9838925/is-there-any-method-to-iterate-a-map-with-handlebars-js\r\nHandlebars.registerHelper('eachInMap', function (map, block) {\r\n var out = '';\r\n Object.keys(map).map(function (prop) {\r\n let data = map[prop];\r\n if (typeof data === 'object') {\r\n data.id = data.id || prop;\r\n out += block.fn(data);\r\n } else {\r\n out += block.fn({ id: prop, value: data });\r\n }\r\n });\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('add', function (a, b) {\r\n var out = a + b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('eq', function (a, b) {\r\n var out = (a == b);\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('or', function (a, b) {\r\n var out = a || b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('not', function (a) {\r\n var out = !a;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('count', function (map) {\r\n return map.length;\r\n});\r\n\r\nHandlebars.registerHelper('gt', function (a, b) {\r\n var out = a > b;\r\n return out;\r\n});\r\n\r\n/**\r\n * This class represents a single template in the viewer's template tree.\r\n * An example for a template is a single canvas, an overlay (containing sub-templates) or the navigation bar.\r\n * A template is injected using the template manager in the correct position.\r\n * The template is rendered using Handlebars and can use Handlebars' features (such as parameter injection)\r\n *\r\n * For further information please refer to the documentation page, https://doc.babylonjs.com\r\n */\r\nexport class Template {\r\n\r\n /**\r\n * Will be triggered when the template is loaded\r\n */\r\n public onLoaded: Observable<Template>;\r\n /**\r\n * will be triggered when the template is appended to the tree\r\n */\r\n public onAppended: Observable<Template>;\r\n /**\r\n * Will be triggered when the template's state changed (shown, hidden)\r\n */\r\n public onStateChange: Observable<Template>;\r\n /**\r\n * Will be triggered when an event is triggered on ths template.\r\n * The event is a native browser event (like mouse or pointer events)\r\n */\r\n public onEventTriggered: Observable<EventCallback>;\r\n\r\n public onParamsUpdated: Observable<Template>;\r\n\r\n public onHTMLRendered: Observable<Template>;\r\n\r\n /**\r\n * is the template loaded?\r\n */\r\n public isLoaded: boolean;\r\n /**\r\n * This is meant to be used to track the show and hide functions.\r\n * This is NOT (!!) a flag to check if the element is actually visible to the user.\r\n */\r\n public isShown: boolean;\r\n\r\n /**\r\n * Is this template a part of the HTML tree (the template manager injected it)\r\n */\r\n public isInHtmlTree: boolean;\r\n\r\n /**\r\n * The HTML element containing this template\r\n */\r\n public parent: HTMLElement;\r\n\r\n /**\r\n * A promise that is fulfilled when the template finished loading.\r\n */\r\n public initPromise: Promise<Template>;\r\n\r\n private _fragment: DocumentFragment | Element;\r\n private _addedFragment: DocumentFragment | Element;\r\n private _htmlTemplate: string;\r\n private _rawHtml: string;\r\n\r\n private loadRequests: Array<IFileRequest>;\r\n\r\n constructor(public name: string, private _configuration: ITemplateConfiguration) {\r\n this.onLoaded = new Observable<Template>();\r\n this.onAppended = new Observable<Template>();\r\n this.onStateChange = new Observable<Template>();\r\n this.onEventTriggered = new Observable<EventCallback>();\r\n this.onParamsUpdated = new Observable<Template>();\r\n this.onHTMLRendered = new Observable<Template>();\r\n\r\n this.loadRequests = [];\r\n\r\n this.isLoaded = false;\r\n this.isShown = false;\r\n this.isInHtmlTree = false;\r\n\r\n let htmlContentPromise = this._getTemplateAsHtml(_configuration);\r\n\r\n this.initPromise = htmlContentPromise.then((htmlTemplate) => {\r\n if (htmlTemplate) {\r\n this._htmlTemplate = htmlTemplate;\r\n let compiledTemplate = Handlebars.compile(htmlTemplate, { noEscape: (this._configuration.params && !!this._configuration.params.noEscape) });\r\n let config = this._configuration.params || {};\r\n this._rawHtml = compiledTemplate(config);\r\n try {\r\n this._fragment = document.createRange().createContextualFragment(this._rawHtml);\r\n } catch (e) {\r\n let test = document.createElement(this.name);\r\n test.innerHTML = this._rawHtml;\r\n this._fragment = test;\r\n }\r\n this.isLoaded = true;\r\n this.isShown = true;\r\n this.onLoaded.notifyObservers(this);\r\n }\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Some templates have parameters (like background color for example).\r\n * The parameters are provided to Handlebars which in turn generates the template.\r\n * This function will update the template with the new parameters\r\n *\r\n * Note that when updating parameters the events will be registered again (after being cleared).\r\n *\r\n * @param params the new template parameters\r\n */\r\n public updateParams(params: { [key: string]: string | number | boolean | object }, append: boolean = true) {\r\n if (append) {\r\n this._configuration.params = deepmerge(this._configuration.params, params);\r\n } else {\r\n this._configuration.params = params;\r\n }\r\n // update the template\r\n if (this.isLoaded) {\r\n // this.dispose();\r\n }\r\n let compiledTemplate = Handlebars.compile(this._htmlTemplate);\r\n let config = this._configuration.params || {};\r\n this._rawHtml = compiledTemplate(config);\r\n try {\r\n this._fragment = document.createRange().createContextualFragment(this._rawHtml);\r\n } catch (e) {\r\n let test = document.createElement(this.name);\r\n test.innerHTML = this._rawHtml;\r\n this._fragment = test;\r\n }\r\n if (this.parent) {\r\n this.appendTo(this.parent, true);\r\n }\r\n }\r\n\r\n public redraw() {\r\n this.updateParams({});\r\n }\r\n\r\n /**\r\n * Get the template'S configuration\r\n */\r\n public get configuration(): ITemplateConfiguration {\r\n return this._configuration;\r\n }\r\n\r\n /**\r\n * A template can be a parent element for other templates or HTML elements.\r\n * This function will deliver all child HTML elements of this template.\r\n */\r\n public getChildElements(): Array<string> {\r\n let childrenArray: string[] = [];\r\n //Edge and IE don't support frage,ent.children\r\n let children: HTMLCollection | NodeListOf<Element> = this._fragment && this._fragment.children;\r\n if (!this._fragment) {\r\n let fragment = this.parent.querySelector(this.name);\r\n if (fragment) {\r\n children = fragment.querySelectorAll('*');\r\n }\r\n }\r\n if (!children) {\r\n // casting to HTMLCollection, as both NodeListOf and HTMLCollection have 'item()' and 'length'.\r\n children = this._fragment.querySelectorAll('*');\r\n }\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children.item(i);\r\n if (child) {\r\n childrenArray.push(kebabToCamel(child.nodeName.toLowerCase()));\r\n }\r\n }\r\n return childrenArray;\r\n }\r\n\r\n /**\r\n * Appending the template to a parent HTML element.\r\n * If a parent is already set and you wish to replace the old HTML with new one, forceRemove should be true.\r\n * @param parent the parent to which the template is added\r\n * @param forceRemove if the parent already exists, shoud the template be removed from it?\r\n */\r\n public appendTo(parent: HTMLElement, forceRemove?: boolean) {\r\n if (this.parent) {\r\n if (forceRemove && this._addedFragment) {\r\n /*let fragement = this.parent.querySelector(this.name)\r\n if (fragement)\r\n this.parent.removeChild(fragement);*/\r\n this.parent.innerHTML = '';\r\n } else {\r\n return;\r\n }\r\n }\r\n this.parent = parent;\r\n\r\n if (this._configuration.id) {\r\n this.parent.id = this._configuration.id;\r\n }\r\n if (this._fragment) {\r\n this.parent.appendChild(this._fragment);\r\n this._addedFragment = this._fragment;\r\n } else {\r\n this.parent.insertAdjacentHTML(\"beforeend\", this._rawHtml);\r\n }\r\n\r\n this.onHTMLRendered.notifyObservers(this);\r\n\r\n // appended only one frame after.\r\n setTimeout(() => {\r\n this._registerEvents();\r\n this.onAppended.notifyObservers(this);\r\n });\r\n }\r\n\r\n private _isShowing: boolean;\r\n private _isHiding: boolean;\r\n\r\n /**\r\n * Show the template using the provided visibilityFunction, or natively using display: flex.\r\n * The provided function returns a promise that should be fullfilled when the element is shown.\r\n * Since it is a promise async operations are more than possible.\r\n * See the default viewer for an opacity example.\r\n * @param visibilityFunction The function to execute to show the template.\r\n */\r\n public show(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template> {\r\n if (this._isHiding) { return Promise.resolve(this); }\r\n return Promise.resolve().then(() => {\r\n this._isShowing = true;\r\n if (visibilityFunction) {\r\n return visibilityFunction(this);\r\n } else {\r\n // flex? box? should this be configurable easier than the visibilityFunction?\r\n this.parent.style.display = 'flex';\r\n // support old browsers with no flex:\r\n if (this.parent.style.display !== 'flex') {\r\n this.parent.style.display = '';\r\n }\r\n return this;\r\n }\r\n }).then(() => {\r\n this.isShown = true;\r\n this._isShowing = false;\r\n this.onStateChange.notifyObservers(this);\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Hide the template using the provided visibilityFunction, or natively using display: none.\r\n * The provided function returns a promise that should be fullfilled when the element is hidden.\r\n * Since it is a promise async operations are more than possible.\r\n * See the default viewer for an opacity example.\r\n * @param visibilityFunction The function to execute to show the template.\r\n */\r\n public hide(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template> {\r\n if (this._isShowing) { return Promise.resolve(this); }\r\n return Promise.resolve().then(() => {\r\n this._isHiding = true;\r\n if (visibilityFunction) {\r\n return visibilityFunction(this);\r\n } else {\r\n // flex? box? should this be configurable easier than the visibilityFunction?\r\n this.parent.style.display = 'none';\r\n return this;\r\n }\r\n }).then(() => {\r\n this.isShown = false;\r\n this._isHiding = false;\r\n this.onStateChange.notifyObservers(this);\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Dispose this template\r\n */\r\n public dispose() {\r\n this.onAppended.clear();\r\n this.onEventTriggered.clear();\r\n this.onLoaded.clear();\r\n this.onStateChange.clear();\r\n this.isLoaded = false;\r\n // remove from parent\r\n try {\r\n this.parent.removeChild(this._fragment);\r\n } catch (e) {\r\n //noop\r\n }\r\n\r\n this.loadRequests.forEach((request) => {\r\n request.abort();\r\n });\r\n\r\n if (this._registeredEvents) {\r\n this._registeredEvents.forEach((evt) => {\r\n evt.htmlElement.removeEventListener(evt.eventName, evt.function);\r\n });\r\n }\r\n }\r\n\r\n private _getTemplateAsHtml(templateConfig: ITemplateConfiguration): Promise<string> {\r\n if (!templateConfig) {\r\n return Promise.reject('No templateConfig provided');\r\n } else if (templateConfig.html && !templateConfig.location) {\r\n return Promise.resolve(templateConfig.html);\r\n } else {\r\n let location = this._getTemplateLocation(templateConfig);\r\n if (isUrl(location)) {\r\n return new Promise((resolve, reject) => {\r\n let fileRequest = Tools.LoadFile(location, (data: string) => {\r\n resolve(data);\r\n }, undefined, undefined, false, (request, error: any) => {\r\n reject(error);\r\n });\r\n this.loadRequests.push(fileRequest);\r\n });\r\n } else {\r\n location = location.replace('#', '');\r\n let element = document.getElementById(location);\r\n if (element) {\r\n return Promise.resolve(element.innerHTML);\r\n } else {\r\n return Promise.reject('Template ID not found');\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _registeredEvents: Array<{ htmlElement: HTMLElement, eventName: string, function: EventListenerOrEventListenerObject }>;\r\n\r\n private _registerEvents() {\r\n this._registeredEvents = this._registeredEvents || [];\r\n if (this._registeredEvents.length) {\r\n // first remove the registered events\r\n this._registeredEvents.forEach((evt) => {\r\n evt.htmlElement.removeEventListener(evt.eventName, evt.function);\r\n });\r\n }\r\n if (this._configuration.events) {\r\n for (let eventName in this._configuration.events) {\r\n if (this._configuration.events && this._configuration.events[eventName]) {\r\n let functionToFire = (selector, event) => {\r\n this.onEventTriggered.notifyObservers({ event: event, template: this, selector: selector });\r\n };\r\n\r\n // if boolean, set the parent as the event listener\r\n if (typeof this._configuration.events[eventName] === 'boolean') {\r\n let selector = this.parent.id;\r\n if (selector) {\r\n selector = '#' + selector;\r\n } else {\r\n selector = this.parent.tagName;\r\n }\r\n let binding = functionToFire.bind(this, selector);\r\n this.parent.addEventListener(eventName, binding, false);\r\n this._registeredEvents.push({\r\n htmlElement: this.parent,\r\n eventName: eventName,\r\n function: binding\r\n });\r\n } else if (typeof this._configuration.events[eventName] === 'object') {\r\n let selectorsArray: Array<string> = Object.keys((this._configuration.events[eventName] as object) || {});\r\n // strict null checl is working incorrectly, must override:\r\n let event = this._configuration.events[eventName] || {};\r\n selectorsArray.filter((selector) => event[selector]).forEach((selector) => {\r\n let htmlElement = <HTMLElement>this.parent.querySelector(selector);\r\n if (!htmlElement) {\r\n // backcompat, fallback to id\r\n if (selector && selector.indexOf('#') !== 0) {\r\n selector = '#' + selector;\r\n }\r\n try {\r\n htmlElement = <HTMLElement>this.parent.querySelector(selector);\r\n } catch (e) { }\r\n }\r\n if (htmlElement) {\r\n let binding = functionToFire.bind(this, selector);\r\n htmlElement.addEventListener(eventName, binding, false);\r\n this._registeredEvents.push({\r\n htmlElement: htmlElement,\r\n eventName: eventName,\r\n function: binding\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getTemplateLocation(templateConfig): string {\r\n if (!templateConfig || typeof templateConfig === 'string') {\r\n return templateConfig;\r\n } else {\r\n return templateConfig.location;\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"templateManager.js","sourceRoot":"","sources":["../../../../../tools/viewer/src/templating/templateManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from \"core/Misc/observable\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n// eslint-disable-next-line import/no-internal-modules\r\nimport { isUrl, camelToKebab, kebabToCamel, deepmerge } from \"../helper/index\";\r\n\r\nimport * as Handlebars from \"handlebars\";\r\nimport { EventManager } from \"./eventManager\";\r\nimport type { ITemplateConfiguration } from \"../configuration/interfaces/templateConfiguration\";\r\nimport type { IFileRequest } from \"core/Misc/fileRequest\";\r\n\r\n/**\r\n * The object sent when an event is triggered\r\n */\r\nexport interface EventCallback {\r\n event: Event;\r\n template: Template;\r\n selector: string;\r\n payload?: any;\r\n}\r\n\r\n/**\r\n * The template manager, a member of the viewer class, will manage the viewer's templates and generate the HTML.\r\n * The template manager managers a single viewer and can be seen as the collection of all sub-templates of the viewer.\r\n */\r\nexport class TemplateManager {\r\n /**\r\n * Will be triggered when any template is initialized\r\n */\r\n public onTemplateInit: Observable<Template>;\r\n /**\r\n * Will be triggered when any template is fully loaded\r\n */\r\n public onTemplateLoaded: Observable<Template>;\r\n /**\r\n * Will be triggered when a template state changes\r\n */\r\n public onTemplateStateChange: Observable<Template>;\r\n /**\r\n * Will be triggered when all templates finished loading\r\n */\r\n public onAllLoaded: Observable<TemplateManager>;\r\n /**\r\n * Will be triggered when any event on any template is triggered.\r\n */\r\n public onEventTriggered: Observable<EventCallback>;\r\n\r\n /**\r\n * This template manager's event manager. In charge of callback registrations to native event types\r\n */\r\n public eventManager: EventManager;\r\n\r\n private _templates: { [name: string]: Template };\r\n\r\n constructor(public containerElement: Element) {\r\n this._templates = {};\r\n\r\n this.onTemplateInit = new Observable<Template>();\r\n this.onTemplateLoaded = new Observable<Template>();\r\n this.onTemplateStateChange = new Observable<Template>();\r\n this.onAllLoaded = new Observable<TemplateManager>();\r\n this.onEventTriggered = new Observable<EventCallback>();\r\n\r\n this.eventManager = new EventManager(this);\r\n }\r\n\r\n /**\r\n * Initialize the template(s) for the viewer. Called bay the Viewer class\r\n * @param templates the templates to be used to initialize the main template\r\n */\r\n public initTemplate(templates: { [key: string]: ITemplateConfiguration }) {\r\n const internalInit = (dependencyMap: any, name: string, parentTemplate?: Template) => {\r\n //init template\r\n const template = this._templates[name];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n Object.keys(dependencyMap).map((childName) => {\r\n return internalInit(dependencyMap[childName], childName, template);\r\n });\r\n\r\n // register the observers\r\n //template.onLoaded.add(() => {\r\n const addToParent = () => {\r\n const lastElements = parentTemplate && parentTemplate.parent.querySelectorAll(camelToKebab(name) as keyof HTMLElementTagNameMap);\r\n const containingElement = (lastElements && lastElements.length && lastElements.item(lastElements.length - 1)) || this.containerElement;\r\n template.appendTo(<HTMLElement>containingElement);\r\n this._checkLoadedState();\r\n };\r\n\r\n if (parentTemplate && !parentTemplate.parent) {\r\n parentTemplate.onAppended.add(() => {\r\n addToParent();\r\n });\r\n } else {\r\n addToParent();\r\n }\r\n //});\r\n\r\n return template;\r\n };\r\n\r\n //build the html tree\r\n return this._buildHTMLTree(templates).then((htmlTree) => {\r\n if (this._templates[\"main\"]) {\r\n internalInit(htmlTree, \"main\");\r\n } else {\r\n this._checkLoadedState();\r\n }\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * This function will create a simple map with child-dependencies of the template html tree.\r\n * It will compile each template, check if its children exist in the configuration and will add them if they do.\r\n * It is expected that the main template will be called main!\r\n *\r\n * @param templates\r\n */\r\n private _buildHTMLTree(templates: { [key: string]: ITemplateConfiguration }): Promise<object> {\r\n const promises: Array<Promise<Template | boolean>> = Object.keys(templates).map((name) => {\r\n // if the template was overridden\r\n if (!templates[name]) {\r\n return Promise.resolve(false);\r\n }\r\n // else - we have a template, let's do our job!\r\n const template = new Template(name, templates[name]);\r\n template.onLoaded.add(() => {\r\n this.onTemplateLoaded.notifyObservers(template);\r\n });\r\n template.onStateChange.add(() => {\r\n this.onTemplateStateChange.notifyObservers(template);\r\n });\r\n this.onTemplateInit.notifyObservers(template);\r\n // make sure the global onEventTriggered is called as well\r\n template.onEventTriggered.add((eventData) => this.onEventTriggered.notifyObservers(eventData));\r\n this._templates[name] = template;\r\n return template.initPromise;\r\n });\r\n\r\n return Promise.all(promises).then(() => {\r\n const templateStructure = {};\r\n // now iterate through all templates and check for children:\r\n const buildTree = (parentObject: any, name: string) => {\r\n this._templates[name].isInHtmlTree = true;\r\n const childNodes = this._templates[name].getChildElements().filter((n) => !!this._templates[n]);\r\n childNodes.forEach((element) => {\r\n parentObject[element] = {};\r\n buildTree(parentObject[element], element);\r\n });\r\n };\r\n if (this._templates[\"main\"]) {\r\n buildTree(templateStructure, \"main\");\r\n }\r\n return templateStructure;\r\n });\r\n }\r\n\r\n /**\r\n * Get the canvas in the template tree.\r\n * There must be one and only one canvas inthe template.\r\n */\r\n public getCanvas(): HTMLCanvasElement | null {\r\n return this.containerElement.querySelector(\"canvas\");\r\n }\r\n\r\n /**\r\n * Get a specific template from the template tree\r\n * @param name the name of the template to load\r\n */\r\n public getTemplate(name: string): Template | undefined {\r\n return this._templates[name];\r\n }\r\n\r\n private _checkLoadedState() {\r\n const done =\r\n Object.keys(this._templates).length === 0 ||\r\n Object.keys(this._templates).every((key) => {\r\n return (this._templates[key].isLoaded && !!this._templates[key].parent) || !this._templates[key].isInHtmlTree;\r\n });\r\n\r\n if (done) {\r\n this.onAllLoaded.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the template manager\r\n */\r\n public dispose() {\r\n // dispose all templates\r\n Object.keys(this._templates).forEach((template) => {\r\n this._templates[template].dispose();\r\n });\r\n this._templates = {};\r\n this.eventManager.dispose();\r\n\r\n this.onTemplateInit.clear();\r\n this.onAllLoaded.clear();\r\n this.onEventTriggered.clear();\r\n this.onTemplateLoaded.clear();\r\n this.onTemplateStateChange.clear();\r\n }\r\n}\r\n\r\n// register a new helper. modified https://stackoverflow.com/questions/9838925/is-there-any-method-to-iterate-a-map-with-handlebars-js\r\nHandlebars.registerHelper(\"eachInMap\", function (map, block) {\r\n let out = \"\";\r\n Object.keys(map).map(function (prop) {\r\n const data = map[prop];\r\n if (typeof data === \"object\") {\r\n data.id = data.id || prop;\r\n out += block.fn(data);\r\n } else {\r\n out += block.fn({ id: prop, value: data });\r\n }\r\n });\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper(\"add\", function (a, b) {\r\n const out = a + b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper(\"eq\", function (a, b) {\r\n const out = a == b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper(\"or\", function (a, b) {\r\n const out = a || b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper(\"not\", function (a) {\r\n const out = !a;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper(\"count\", function (map) {\r\n return map.length;\r\n});\r\n\r\nHandlebars.registerHelper(\"gt\", function (a, b) {\r\n const out = a > b;\r\n return out;\r\n});\r\n\r\n/**\r\n * This class represents a single template in the viewer's template tree.\r\n * An example for a template is a single canvas, an overlay (containing sub-templates) or the navigation bar.\r\n * A template is injected using the template manager in the correct position.\r\n * The template is rendered using Handlebars and can use Handlebars' features (such as parameter injection)\r\n *\r\n * For further information please refer to the documentation page, https://doc.babylonjs.com\r\n */\r\nexport class Template {\r\n /**\r\n * Will be triggered when the template is loaded\r\n */\r\n public onLoaded: Observable<Template>;\r\n /**\r\n * will be triggered when the template is appended to the tree\r\n */\r\n public onAppended: Observable<Template>;\r\n /**\r\n * Will be triggered when the template's state changed (shown, hidden)\r\n */\r\n public onStateChange: Observable<Template>;\r\n /**\r\n * Will be triggered when an event is triggered on ths template.\r\n * The event is a native browser event (like mouse or pointer events)\r\n */\r\n public onEventTriggered: Observable<EventCallback>;\r\n\r\n public onParamsUpdated: Observable<Template>;\r\n\r\n public onHTMLRendered: Observable<Template>;\r\n\r\n /**\r\n * is the template loaded?\r\n */\r\n public isLoaded: boolean;\r\n /**\r\n * This is meant to be used to track the show and hide functions.\r\n * This is NOT (!!) a flag to check if the element is actually visible to the user.\r\n */\r\n public isShown: boolean;\r\n\r\n /**\r\n * Is this template a part of the HTML tree (the template manager injected it)\r\n */\r\n public isInHtmlTree: boolean;\r\n\r\n /**\r\n * The HTML element containing this template\r\n */\r\n public parent: HTMLElement;\r\n\r\n /**\r\n * A promise that is fulfilled when the template finished loading.\r\n */\r\n public initPromise: Promise<Template>;\r\n\r\n private _fragment: DocumentFragment | Element;\r\n private _addedFragment: DocumentFragment | Element;\r\n private _htmlTemplate: string;\r\n private _rawHtml: string;\r\n\r\n private _loadRequests: Array<IFileRequest>;\r\n\r\n constructor(public name: string, private _configuration: ITemplateConfiguration) {\r\n this.onLoaded = new Observable<Template>();\r\n this.onAppended = new Observable<Template>();\r\n this.onStateChange = new Observable<Template>();\r\n this.onEventTriggered = new Observable<EventCallback>();\r\n this.onParamsUpdated = new Observable<Template>();\r\n this.onHTMLRendered = new Observable<Template>();\r\n\r\n this._loadRequests = [];\r\n\r\n this.isLoaded = false;\r\n this.isShown = false;\r\n this.isInHtmlTree = false;\r\n\r\n const htmlContentPromise = this._getTemplateAsHtml(_configuration);\r\n\r\n this.initPromise = htmlContentPromise.then((htmlTemplate) => {\r\n if (htmlTemplate) {\r\n this._htmlTemplate = htmlTemplate;\r\n const compiledTemplate = Handlebars.compile(htmlTemplate, { noEscape: this._configuration.params && !!this._configuration.params.noEscape });\r\n const config = this._configuration.params || {};\r\n this._rawHtml = compiledTemplate(config);\r\n try {\r\n this._fragment = document.createRange().createContextualFragment(this._rawHtml);\r\n } catch (e) {\r\n const test = document.createElement(this.name);\r\n test.innerHTML = this._rawHtml;\r\n this._fragment = test;\r\n }\r\n this.isLoaded = true;\r\n this.isShown = true;\r\n this.onLoaded.notifyObservers(this);\r\n }\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Some templates have parameters (like background color for example).\r\n * The parameters are provided to Handlebars which in turn generates the template.\r\n * This function will update the template with the new parameters\r\n *\r\n * Note that when updating parameters the events will be registered again (after being cleared).\r\n *\r\n * @param params the new template parameters\r\n * @param append\r\n */\r\n public updateParams(params: { [key: string]: string | number | boolean | object }, append: boolean = true) {\r\n if (append) {\r\n this._configuration.params = deepmerge(this._configuration.params, params);\r\n } else {\r\n this._configuration.params = params;\r\n }\r\n // update the template\r\n if (this.isLoaded) {\r\n // this.dispose();\r\n }\r\n const compiledTemplate = Handlebars.compile(this._htmlTemplate);\r\n const config = this._configuration.params || {};\r\n this._rawHtml = compiledTemplate(config);\r\n try {\r\n this._fragment = document.createRange().createContextualFragment(this._rawHtml);\r\n } catch (e) {\r\n const test = document.createElement(this.name);\r\n test.innerHTML = this._rawHtml;\r\n this._fragment = test;\r\n }\r\n if (this.parent) {\r\n this.appendTo(this.parent, true);\r\n }\r\n }\r\n\r\n public redraw() {\r\n this.updateParams({});\r\n }\r\n\r\n /**\r\n * Get the template'S configuration\r\n */\r\n public get configuration(): ITemplateConfiguration {\r\n return this._configuration;\r\n }\r\n\r\n /**\r\n * A template can be a parent element for other templates or HTML elements.\r\n * This function will deliver all child HTML elements of this template.\r\n */\r\n public getChildElements(): Array<string> {\r\n const childrenArray: string[] = [];\r\n //Edge and IE don't support frage,ent.children\r\n let children: HTMLCollection | NodeListOf<Element> = this._fragment && this._fragment.children;\r\n if (!this._fragment) {\r\n const fragment = this.parent.querySelector(this.name);\r\n if (fragment) {\r\n children = fragment.querySelectorAll(\"*\");\r\n }\r\n }\r\n if (!children) {\r\n // casting to HTMLCollection, as both NodeListOf and HTMLCollection have 'item()' and 'length'.\r\n children = this._fragment.querySelectorAll(\"*\");\r\n }\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children.item(i);\r\n if (child) {\r\n childrenArray.push(kebabToCamel(child.nodeName.toLowerCase()));\r\n }\r\n }\r\n return childrenArray;\r\n }\r\n\r\n /**\r\n * Appending the template to a parent HTML element.\r\n * If a parent is already set and you wish to replace the old HTML with new one, forceRemove should be true.\r\n * @param parent the parent to which the template is added\r\n * @param forceRemove if the parent already exists, shoud the template be removed from it?\r\n */\r\n public appendTo(parent: HTMLElement, forceRemove?: boolean) {\r\n if (this.parent) {\r\n if (forceRemove && this._addedFragment) {\r\n /*let fragement = this.parent.querySelector(this.name)\r\n if (fragement)\r\n this.parent.removeChild(fragement);*/\r\n this.parent.innerHTML = \"\";\r\n } else {\r\n return;\r\n }\r\n }\r\n this.parent = parent;\r\n\r\n if (this._configuration.id) {\r\n this.parent.id = this._configuration.id;\r\n }\r\n if (this._fragment) {\r\n this.parent.appendChild(this._fragment);\r\n this._addedFragment = this._fragment;\r\n } else {\r\n this.parent.insertAdjacentHTML(\"beforeend\", this._rawHtml);\r\n }\r\n\r\n this.onHTMLRendered.notifyObservers(this);\r\n\r\n // appended only one frame after.\r\n setTimeout(() => {\r\n this._registerEvents();\r\n this.onAppended.notifyObservers(this);\r\n });\r\n }\r\n\r\n private _isShowing: boolean;\r\n private _isHiding: boolean;\r\n\r\n /**\r\n * Show the template using the provided visibilityFunction, or natively using display: flex.\r\n * The provided function returns a promise that should be fulfilled when the element is shown.\r\n * Since it is a promise async operations are more than possible.\r\n * See the default viewer for an opacity example.\r\n * @param visibilityFunction The function to execute to show the template.\r\n */\r\n public show(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template> {\r\n if (this._isHiding) {\r\n return Promise.resolve(this);\r\n }\r\n return Promise.resolve()\r\n .then(() => {\r\n this._isShowing = true;\r\n if (visibilityFunction) {\r\n return visibilityFunction(this);\r\n } else {\r\n // flex? box? should this be configurable easier than the visibilityFunction?\r\n this.parent.style.display = \"flex\";\r\n // support old browsers with no flex:\r\n if (this.parent.style.display !== \"flex\") {\r\n this.parent.style.display = \"\";\r\n }\r\n return this;\r\n }\r\n })\r\n .then(() => {\r\n this.isShown = true;\r\n this._isShowing = false;\r\n this.onStateChange.notifyObservers(this);\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Hide the template using the provided visibilityFunction, or natively using display: none.\r\n * The provided function returns a promise that should be fulfilled when the element is hidden.\r\n * Since it is a promise async operations are more than possible.\r\n * See the default viewer for an opacity example.\r\n * @param visibilityFunction The function to execute to show the template.\r\n */\r\n public hide(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template> {\r\n if (this._isShowing) {\r\n return Promise.resolve(this);\r\n }\r\n return Promise.resolve()\r\n .then(() => {\r\n this._isHiding = true;\r\n if (visibilityFunction) {\r\n return visibilityFunction(this);\r\n } else {\r\n // flex? box? should this be configurable easier than the visibilityFunction?\r\n this.parent.style.display = \"none\";\r\n return this;\r\n }\r\n })\r\n .then(() => {\r\n this.isShown = false;\r\n this._isHiding = false;\r\n this.onStateChange.notifyObservers(this);\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Dispose this template\r\n */\r\n public dispose() {\r\n this.onAppended.clear();\r\n this.onEventTriggered.clear();\r\n this.onLoaded.clear();\r\n this.onStateChange.clear();\r\n this.isLoaded = false;\r\n // remove from parent\r\n try {\r\n this.parent.removeChild(this._fragment);\r\n } catch (e) {\r\n //noop\r\n }\r\n\r\n this._loadRequests.forEach((request) => {\r\n request.abort();\r\n });\r\n\r\n if (this._registeredEvents) {\r\n this._registeredEvents.forEach((evt) => {\r\n evt.htmlElement.removeEventListener(evt.eventName, evt.function);\r\n });\r\n }\r\n }\r\n\r\n private _getTemplateAsHtml(templateConfig: ITemplateConfiguration): Promise<string> {\r\n if (!templateConfig) {\r\n return Promise.reject(\"No templateConfig provided\");\r\n } else if (templateConfig.html && !templateConfig.location) {\r\n return Promise.resolve(templateConfig.html);\r\n } else {\r\n let location = this._getTemplateLocation(templateConfig);\r\n if (isUrl(location)) {\r\n return new Promise((resolve, reject) => {\r\n const fileRequest = Tools.LoadFile(\r\n location,\r\n (data: string | ArrayBuffer) => {\r\n resolve(data as string);\r\n },\r\n undefined,\r\n undefined,\r\n false,\r\n (request, error: any) => {\r\n reject(error);\r\n }\r\n );\r\n this._loadRequests.push(fileRequest);\r\n });\r\n } else {\r\n location = location.replace(\"#\", \"\");\r\n const element = document.getElementById(location);\r\n if (element) {\r\n return Promise.resolve(element.innerHTML);\r\n } else {\r\n return Promise.reject(\"Template ID not found\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _registeredEvents: Array<{ htmlElement: HTMLElement; eventName: string; function: EventListenerOrEventListenerObject }>;\r\n\r\n private _registerEvents() {\r\n this._registeredEvents = this._registeredEvents || [];\r\n if (this._registeredEvents.length) {\r\n // first remove the registered events\r\n this._registeredEvents.forEach((evt) => {\r\n evt.htmlElement.removeEventListener(evt.eventName, evt.function);\r\n });\r\n }\r\n if (this._configuration.events) {\r\n for (const eventName in this._configuration.events) {\r\n if (this._configuration.events && this._configuration.events[eventName]) {\r\n const functionToFire = (selector: string, event: Event) => {\r\n this.onEventTriggered.notifyObservers({ event, template: this, selector });\r\n };\r\n\r\n // if boolean, set the parent as the event listener\r\n if (typeof this._configuration.events[eventName] === \"boolean\") {\r\n let selector = this.parent.id;\r\n if (selector) {\r\n selector = \"#\" + selector;\r\n } else {\r\n selector = this.parent.tagName;\r\n }\r\n const binding = functionToFire.bind(this, selector);\r\n this.parent.addEventListener(eventName, binding, false);\r\n this._registeredEvents.push({\r\n htmlElement: this.parent,\r\n eventName: eventName,\r\n function: binding,\r\n });\r\n } else if (typeof this._configuration.events[eventName] === \"object\") {\r\n const selectorsArray: Array<string> = Object.keys((this._configuration.events[eventName] as object) || {});\r\n // strict null check is working incorrectly, must override:\r\n const event = this._configuration.events[eventName] || {};\r\n selectorsArray\r\n .filter((selector) => typeof event !== \"boolean\" && event[selector])\r\n .forEach((selector) => {\r\n let htmlElement = <HTMLElement>this.parent.querySelector(selector);\r\n if (!htmlElement) {\r\n // backcompat, fallback to id\r\n if (selector && selector.indexOf(\"#\") !== 0) {\r\n selector = \"#\" + selector;\r\n }\r\n try {\r\n htmlElement = <HTMLElement>this.parent.querySelector(selector);\r\n } catch (e) {}\r\n }\r\n if (htmlElement) {\r\n const binding = functionToFire.bind(this, selector);\r\n htmlElement.addEventListener(eventName, binding, false);\r\n this._registeredEvents.push({\r\n htmlElement: htmlElement,\r\n eventName: eventName,\r\n function: binding,\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getTemplateLocation(templateConfig: ITemplateConfiguration): string {\r\n if (!templateConfig || typeof templateConfig === \"string\") {\r\n return templateConfig;\r\n } else {\r\n return templateConfig.location!;\r\n }\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import { EventCallback, Template } from "./templateManager";
1
+ import type { EventCallback, Template } from "./templateManager";
2
2
  export interface IViewerTemplatePlugin {
3
3
  readonly templateName: string;
4
4
  readonly eventsToAttach?: Array<string>;
@@ -1,15 +1,15 @@
1
- import * as Handlebars from 'handlebars/dist/handlebars';
1
+ import * as Handlebars from "handlebars";
2
2
  var AbstractViewerNavbarButton = /** @class */ (function () {
3
3
  function AbstractViewerNavbarButton(buttonName, buttonClass, htmlTemplate) {
4
4
  this.templateName = "navBar";
5
- this.eventsToAttach = ['pointerdown'];
5
+ this.eventsToAttach = ["pointerdown"];
6
6
  this._prepend = true;
7
7
  this._buttonName = buttonName;
8
8
  if (buttonClass) {
9
9
  this._buttonClass = buttonClass;
10
10
  }
11
11
  else {
12
- this._buttonClass = buttonName + '-button';
12
+ this._buttonClass = buttonName + "-button";
13
13
  }
14
14
  if (htmlTemplate) {
15
15
  this._htmlTemplate = htmlTemplate;
@@ -49,7 +49,7 @@ var AbstractViewerNavbarButton = /** @class */ (function () {
49
49
  }
50
50
  };
51
51
  AbstractViewerNavbarButton.prototype._generateHTMLElement = function (template) {
52
- var compiledTemplate = Handlebars.compile(this._htmlTemplate, { noEscape: (template.configuration.params && !!template.configuration.params.noEscape) });
52
+ var compiledTemplate = Handlebars.compile(this._htmlTemplate, { noEscape: template.configuration.params && !!template.configuration.params.noEscape });
53
53
  var config = template.configuration.params || {};
54
54
  var rawHtml = compiledTemplate(config);
55
55
  var fragment;