Skip to content

Commit 629a4d7

Browse files
annawilczurammilian
authored andcommitted
feat:export viewer as webcomponent
* Add rootDOMNode parameter to allow using bim-viewer inside shadowRoot * Add bim-viewer custom web component * add a static method to register the web component, optionally with a custom name * ShadowRoot related changes * :Fix typos * Remove rollup terser from dev config * Mutual containerElement for BimViewer and Explorers * Update example * Fix iframe issue with not valid input id * Add 'parentNode' config param to SectionTool * Handle camera pivot * Add support for positioning on window scroll * Handle rotation pivot element * Add support for horizontally scrolled positions * Fix icons not displaying * Add HTML attributes replacing query params * Add custom event attribute 'onObjectSelected' * Expose bimViewer instance in web component * Remove pivot substitute * Add HTML attributes * Update example * fix: behavior of explorer panel on scroll * Prevent page from scrolling when mouse is over viewer canvas * Update web coponent example * Move rollup stuff to devdependencies * Upgrade xeokit
1 parent d77b036 commit 629a4d7

17 files changed

Lines changed: 1193 additions & 3622 deletions

index.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import {Server} from "./src/server/Server.js";
22
import {BIMViewer} from "./src/BIMViewer.js";
33
import {LocaleService} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";
4+
import BimViewerWebComponent from "./src/webComponent/webComponent.js";
45

5-
export {BIMViewer};
6-
export {Server};
7-
export {LocaleService};
8-
6+
export { BIMViewer, Server, LocaleService, BimViewerWebComponent };

package-lock.json

Lines changed: 526 additions & 3546 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"name": "@xeokit/xeokit-bim-viewer",
33
"version": "2.6.1",
4+
"type": "module",
45
"description": "BIM viewer built on xeokit",
56
"main": "dist/xeokit-bim-viewer.min.es.js",
67
"files": [
@@ -56,18 +57,21 @@
5657
},
5758
"homepage": "https://github.com/xeokit/xeokit-bim-viewer#readme",
5859
"devDependencies": {
59-
"@rollup/plugin-node-resolve": "^13.2.1",
60+
"@rollup/plugin-node-resolve": "^16.0.1",
61+
"@rollup/plugin-terser": "^0.4.4",
62+
"@rollup/plugin-url": "^8.0.2",
63+
"auto-changelog": "^2.4.0",
6064
"autoprefixer": "^9.8.6",
6165
"copyfiles": "^2.4.1",
6266
"esdoc": "^1.1.0",
6367
"esdoc-standard-plugin": "^1.0.0",
6468
"puppeteer": "^10.1.0",
65-
"rollup": "^2.70.2",
66-
"rollup-plugin-terser": "^7.0.2",
67-
"auto-changelog": "^2.4.0"
69+
"rollup": "^4.39.0",
70+
"rollup-plugin-import-css": "^3.5.8"
6871
},
6972
"dependencies": {
70-
"@xeokit/xeokit-sdk": "2.6.69",
73+
"@fortawesome/fontawesome-free": "^6.7.2",
74+
"@xeokit/xeokit-sdk": "^2.6.75",
7175
"http-server": "^13.0.2"
7276
}
7377
}

rollup.config.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
import {nodeResolve} from '@rollup/plugin-node-resolve';
2-
import {terser} from "rollup-plugin-terser";
2+
import terser from "@rollup/plugin-terser";
3+
import css from "rollup-plugin-import-css";
4+
import url from "@rollup/plugin-url";
35

46
export default {
57
input: './index.js',
68
output: [{
79
file: './dist/xeokit-bim-viewer.min.es.js',
810
format: 'es',
911
name: 'bundle'
10-
},
11-
{
12-
file: './dist/xeokit-bim-viewer.min.umd.js',
13-
format: 'umd',
14-
name: 'bundle'
15-
}],
12+
},],
1613
plugins: [
14+
css(),
1715
nodeResolve(),
18-
terser()
16+
terser(),
17+
url(
18+
{
19+
include: ['**/*.woff', '**/*.woff2', '**/*.ttf'],
20+
limit: 1024 * 1024,
21+
}
22+
)
1923
]
2024
}

rollup.dev.config.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
import {nodeResolve} from '@rollup/plugin-node-resolve';
2-
import {terser} from "rollup-plugin-terser";
2+
import css from "rollup-plugin-import-css";
3+
import url from "@rollup/plugin-url";
34

45
export default {
56
input: './index.js',
67
output: [{
78
file: './dist/xeokit-bim-viewer.es.js',
89
format: 'es',
910
name: 'bundle'
10-
},
11-
{
12-
file: './dist/xeokit-bim-viewer.umd.js',
13-
format: 'umd',
14-
name: 'bundle'
15-
}],
11+
},],
1612
plugins: [
17-
nodeResolve()
13+
css(),
14+
nodeResolve(),
15+
url(
16+
{
17+
include: ['**/*.woff', '**/*.woff2', '**/*.ttf'],
18+
limit: 1024 * 1024,
19+
}
20+
),
1821
]
1922
}

src/BIMViewer.js

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ class BIMViewer extends Controller {
187187
* @param {Boolean} [cfg.enableEditModels=false] Set ````true```` to show "Add", "Edit" and "Delete" options in the Models tab's context menu.
188188
* @param {Boolean} [cfg.enableMeasurements=true] Set ````true```` to enable distance and angle measurements with the BIMViewer.
189189
* @param {Boolean} [cfg.keyboardEventsElement] Optional reference to HTML element on which key events should be handled. Defaults to the HTML Document.
190+
* @param {Node | undefined} [cfg.containerElement] Optional reference of an existing DOM Node (e.g. ShadowRoot), which encapsulates all HTML elements related to viewer plugins, defaults to ````document.body````.
190191
*/
191192
constructor(server, cfg = {}) {
192193

@@ -250,6 +251,7 @@ class BIMViewer extends Controller {
250251

251252
super(null, cfg, server, viewer);
252253

254+
this._containerElement = cfg.containerElement || document.body;
253255
this._configs = {};
254256

255257
this._enableAddModels = !!cfg.enableEditModels;
@@ -271,7 +273,7 @@ class BIMViewer extends Controller {
271273
this._initCanvasContextMenus();
272274

273275
explorerElement.innerHTML = createExplorerTemplate(cfg);
274-
toolbarElement.innerHTML = createToolbarTemplate({enableMeasurements: this._enableMeasurements});
276+
toolbarElement.innerHTML = createToolbarTemplate({ enableMeasurements: this._enableMeasurements });
275277
if (this._enablePropertiesInspector) {
276278
inspectorElement.innerHTML = createInspectorTemplate();
277279
}
@@ -291,31 +293,35 @@ class BIMViewer extends Controller {
291293
unloadModelsButtonElement: explorerElement.querySelector(".xeokit-unloadAllModels"),
292294
addModelButtonElement: explorerElement.querySelector(".xeokit-addModel"), // Can be undefined
293295
modelsElement: explorerElement.querySelector(".xeokit-models"),
294-
enableEditModels: this._enableAddModels
296+
enableEditModels: this._enableAddModels,
297+
containerElement: this._containerElement
295298
});
296299

297300
this._objectsExplorer = new ObjectsExplorer(this, {
298301
enableMeasurements: this._enableMeasurements,
299302
objectsTabElement: explorerElement.querySelector(".xeokit-objectsTab"),
300303
showAllObjectsButtonElement: explorerElement.querySelector(".xeokit-showAllObjects"),
301304
hideAllObjectsButtonElement: explorerElement.querySelector(".xeokit-hideAllObjects"),
302-
objectsElement: explorerElement.querySelector(".xeokit-objects")
305+
objectsElement: explorerElement.querySelector(".xeokit-objects"),
306+
containerElement: this._containerElement
303307
});
304308

305309
this._classesExplorer = new ClassesExplorer(this, {
306310
enableMeasurements: this._enableMeasurements,
307311
classesTabElement: explorerElement.querySelector(".xeokit-classesTab"),
308312
showAllClassesButtonElement: explorerElement.querySelector(".xeokit-showAllClasses"),
309313
hideAllClassesButtonElement: explorerElement.querySelector(".xeokit-hideAllClasses"),
310-
classesElement: explorerElement.querySelector(".xeokit-classes")
314+
classesElement: explorerElement.querySelector(".xeokit-classes"),
315+
containerElement: this._containerElement
311316
});
312317

313318
this._storeysExplorer = new StoreysExplorer(this, {
314319
enableMeasurements: this._enableMeasurements,
315320
storeysTabElement: explorerElement.querySelector(".xeokit-storeysTab"),
316321
showAllStoreysButtonElement: explorerElement.querySelector(".xeokit-showAllStoreys"),
317322
hideAllStoreysButtonElement: explorerElement.querySelector(".xeokit-hideAllStoreys"),
318-
storeysElement: explorerElement.querySelector(".xeokit-storeys")
323+
storeysElement: explorerElement.querySelector(".xeokit-storeys"),
324+
containerElement: this._containerElement
319325
});
320326

321327
if (this._enablePropertiesInspector) {
@@ -411,7 +417,8 @@ class BIMViewer extends Controller {
411417
counterElement: toolbarElement.querySelector(".xeokit-section-counter"),
412418
menuButtonElement: toolbarElement.querySelector(".xeokit-section-menu-button"),
413419
menuButtonArrowElement: toolbarElement.querySelector(".xeokit-section-menu-button-arrow"),
414-
active: false
420+
active: false,
421+
containerElement: this._containerElement
415422
});
416423

417424
if (this._enableMeasurements) {
@@ -465,7 +472,7 @@ class BIMViewer extends Controller {
465472
this._marqueeSelectionTool,
466473
this._sectionTool,
467474
this._enableMeasurements ? this._measureDistanceTool : null,
468-
this._enableMeasurements ? this._measureAngleTool: null
475+
this._enableMeasurements ? this._measureAngleTool : null
469476
]);
470477

471478
explorerElement.querySelector(".xeokit-showAllObjects").addEventListener("click", (event) => {
@@ -606,7 +613,7 @@ class BIMViewer extends Controller {
606613
this.viewer.cameraControl.dollyProximityThreshold = 30.0;
607614

608615
const cameraPivotElement = document.createRange().createContextualFragment("<div class='xeokit-camera-pivot-marker'></div>").firstChild;
609-
document.body.appendChild(cameraPivotElement);
616+
this._containerElement.appendChild(cameraPivotElement);
610617
this.viewer.cameraControl.pivotElement = cameraPivotElement;
611618

612619
scene.camera.perspective.near = 0.01;
@@ -627,11 +634,13 @@ class BIMViewer extends Controller {
627634

628635
this._canvasContextMenu = new CanvasContextMenu(this, {
629636
hideOnAction: true,
630-
enableMeasurements: this._enableMeasurements
637+
enableMeasurements: this._enableMeasurements,
638+
parentNode: this._containerElement
631639
});
632640
this._objectContextMenu = new ObjectContextMenu(this, {
633641
hideOnAction: true,
634-
enableMeasurements: this._enableMeasurements
642+
enableMeasurements: this._enableMeasurements,
643+
parentNode: this._containerElement
635644
});
636645

637646
const getCanvasPosFromEvent = function (event) {

src/BusyModal.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import {Controller} from "./Controller.js";
33
/** @private */
44
class BusyModal extends Controller {
55

6-
constructor(parent, cfg = {}) {
6+
constructor(parent, cfg = {}, rootDOMNode = document) {
77

88
super(parent, cfg);
99

10-
const busyModalBackdropElement = cfg.busyModalBackdropElement || document.body;
10+
const busyModalBackdropElement = cfg.busyModalBackdropElement || rootDOMNode;
1111

1212
if (!busyModalBackdropElement) {
1313
throw "Missing config: busyModalBackdropElement";

src/contextMenus/CanvasContextMenu.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ class CanvasContextMenu extends ContextMenu {
189189
]
190190
}
191191
] : []
192-
]
192+
],
193+
parentNode: cfg.parentNode
193194
});
194195
}
195196
}

src/contextMenus/ModelsContextMenu.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ class ModelsContextMenu extends ContextMenu {
150150
super({
151151
hideOnAction: cfg.hideOnAction,
152152
context: cfg.context,
153-
items: items
153+
items: items,
154+
parentNode: cfg.parentNode
154155
});
155156
}
156157
}

src/explorer/ClassesExplorer.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ClassesExplorer extends Controller {
2525
throw "Missing config: classesElement";
2626
}
2727

28+
this._containerElement = cfg.containerElement;
2829
this._classesTabElement = cfg.classesTabElement;
2930
this._showAllClassesButtonElement = cfg.showAllClassesButtonElement;
3031
this._hideAllClassesButtonElement = cfg.hideAllClassesButtonElement;
@@ -45,7 +46,8 @@ class ClassesExplorer extends Controller {
4546

4647
this._treeViewContextMenu = new TreeViewContextMenu(this.bimViewer, {
4748
hideOnAction: true,
48-
enableMeasurements: cfg.enableMeasurements
49+
enableMeasurements: cfg.enableMeasurements,
50+
parentNode: cfg.containerElement
4951
});
5052

5153
this._treeView.on("contextmenu", (e) => {

0 commit comments

Comments
 (0)