<>
@@ -41,18 +49,7 @@ export default class RealityDataUI extends React.Component<{ iModelName: string,
// Handle changes to the toggle.
private _onChangeToggle = async (checked: boolean) => {
- if (this.state.imodel) {
- const vp = IModelApp.viewManager.selectedView;
- if (undefined === vp) {
- return false;
- }
-
- this.setState({ showRealityData: checked }, async () => {
- await RealityDataApp.toggleRealityModel(checked, vp, this.state.imodel!);
- });
- }
-
- return false;
+ this.setState({ showRealityData: checked });
}
/**
@@ -63,8 +60,7 @@ export default class RealityDataUI extends React.Component<{ iModelName: string,
this.setState({ imodel });
IModelApp.viewManager.onViewOpen.addOnce((_vp: ScreenViewport) => {
- // tslint:disable-next-line no-floating-promises
- this.setState({ imodel, showRealityData: true }, () => { RealityDataApp.toggleRealityModel(true, _vp, imodel); });
+ this.setState({ imodel, showRealityData: true });
});
}
diff --git a/src/frontend-samples/reality-data-sample/sampleSpec.tsx b/src/frontend-samples/reality-data-sample/sampleSpec.tsx
index 98b690620..24b9c0420 100644
--- a/src/frontend-samples/reality-data-sample/sampleSpec.tsx
+++ b/src/frontend-samples/reality-data-sample/sampleSpec.tsx
@@ -16,6 +16,6 @@ export function getRealityDataSpec(): SampleSpec {
{ name: "RealityDataUI.tsx", import: import("!!raw-loader!./RealityDataUI") },
],
customModelList: [SampleIModels.ExtonCampus],
- setup: RealityDataApp.setup,
+ setup: RealityDataApp.setup.bind(RealityDataApp),
});
}
diff --git a/src/frontend-samples/shadow-study-sample/ShadowStudyUI.tsx b/src/frontend-samples/shadow-study-sample/ShadowStudyUI.tsx
index 7d982592a..cd381a2e4 100644
--- a/src/frontend-samples/shadow-study-sample/ShadowStudyUI.tsx
+++ b/src/frontend-samples/shadow-study-sample/ShadowStudyUI.tsx
@@ -103,11 +103,11 @@ export default class ShadowStudyUI extends React.Component<{ iModelName: string,
const minute = this.state.date.getMinutes();
let minString: string;
if (minute < 10)
- minString = "0" + String(minute);
+ minString = `0${String(minute)}`;
else
minString = String(minute);
const hour = this.state.date.getHours();
- return String(hour) + ":" + minString;
+ return `${String(hour)}:${minString}`;
}
// Initialize the data view when a new iModel is loaded
@@ -140,7 +140,7 @@ export default class ShadowStudyUI extends React.Component<{ iModelName: string,
Date
-
{String(this.state.date.getMonth() + 1) + "/" + this.state.date.getDate() + "/" + this.state.date.getFullYear()}
+
{`${String(this.state.date.getMonth() + 1)}/${this.state.date.getDate()}/${this.state.date.getFullYear()}`}
>
diff --git a/src/frontend-samples/shadow-study-sample/sampleSpec.ts b/src/frontend-samples/shadow-study-sample/sampleSpec.ts
index f6b138484..65b6747e0 100644
--- a/src/frontend-samples/shadow-study-sample/sampleSpec.ts
+++ b/src/frontend-samples/shadow-study-sample/sampleSpec.ts
@@ -15,6 +15,6 @@ export function getShadowStudySpec(): SampleSpec {
{ name: "ShadowStudyUI.tsx", import: import("!!raw-loader!./ShadowStudyUI") },
],
- setup: ShadowStudyApp.setup,
+ setup: ShadowStudyApp.setup.bind(ShadowStudyApp),
});
}
diff --git a/src/frontend-samples/thematic-display-sample/sampleSpec.ts b/src/frontend-samples/thematic-display-sample/sampleSpec.ts
index efc557e26..8fdece0a3 100644
--- a/src/frontend-samples/thematic-display-sample/sampleSpec.ts
+++ b/src/frontend-samples/thematic-display-sample/sampleSpec.ts
@@ -16,7 +16,7 @@ export function getThematicDisplaySpec(): SampleSpec {
{ name: "ThematicDisplayUI.tsx", import: import("!!raw-loader!./ThematicDisplayUI") },
],
customModelList: [SampleIModels.RetailBuilding, SampleIModels.MetroStation, SampleIModels.BayTown, SampleIModels.House, SampleIModels.Stadium],
- setup: ThematicDisplaySampleApp.setup,
- teardown: ThematicDisplaySampleApp.teardown,
+ setup: ThematicDisplaySampleApp.setup.bind(ThematicDisplaySampleApp),
+ teardown: ThematicDisplaySampleApp.teardown.bind(ThematicDisplaySampleApp),
});
}
diff --git a/src/frontend-samples/tooltip-customize-sample/TooltipCustomizeApp.tsx b/src/frontend-samples/tooltip-customize-sample/TooltipCustomizeApp.tsx
index 430f81301..cbafd0656 100644
--- a/src/frontend-samples/tooltip-customize-sample/TooltipCustomizeApp.tsx
+++ b/src/frontend-samples/tooltip-customize-sample/TooltipCustomizeApp.tsx
@@ -10,6 +10,7 @@ import { ElemProperty, TooltipCustomizeSettings, TooltipCustomizeUI } from "./To
import { HitDetail, imageElementFromUrl } from "@bentley/imodeljs-frontend";
import SampleApp from "common/SampleApp";
+
// SampleToolAdmin would typically extend ToolAdmin
// See Notes on use of ProxyToolAdmin at the bottom of this file.
// Do this: "class YourToolAdmin extends ToolAdmin"
@@ -28,7 +29,7 @@ export class SampleToolAdmin extends ProxyToolAdmin {
if (!this.settings.showImage && !this.settings.showCustomText && !this.settings.showElementProperty && !this.settings.showDefaultToolTip)
return "";
- const tip = document.createElement("div") as HTMLDivElement;
+ const tip = document.createElement("div");
let needHR = false;
if (this.settings.showImage) {
const img = await imageElementFromUrl(".\\iModeljs-logo.png");
@@ -39,7 +40,7 @@ export class SampleToolAdmin extends ProxyToolAdmin {
if (this.settings.showCustomText) {
if (needHR)
tip.appendChild(document.createElement("hr"));
- const customText = document.createElement("span") as HTMLSpanElement;
+ const customText = document.createElement("span");
customText.innerHTML = this.settings.customText;
tip.appendChild(customText);
needHR = true;
@@ -50,7 +51,7 @@ export class SampleToolAdmin extends ProxyToolAdmin {
tip.appendChild(document.createElement("hr"));
const propertyName = this.settings.elemProperty as string;
- let msg = "
" + propertyName + ": ";
+ let msg = `
${propertyName}: `;
if (hit.isElementHit) {
const query = `SELECT ${propertyName} AS val FROM BisCore.SpatialElement
@@ -68,16 +69,16 @@ export class SampleToolAdmin extends ProxyToolAdmin {
break;
case ElemProperty.Origin:
msg += "
";
- msg += "- x: " + row.val.x + "
";
- msg += "- y: " + row.val.y + "
";
- msg += "- z: " + row.val.z + "
";
+ msg += `- x: ${row.val.x}
`;
+ msg += `- y: ${row.val.y}
`;
+ msg += `- z: ${row.val.z}
`;
msg += "
";
break;
}
}
}
- const htmlTip = document.createElement("span") as HTMLSpanElement;
+ const htmlTip = document.createElement("span");
htmlTip.innerHTML = msg;
tip.appendChild(htmlTip);
needHR = true;
@@ -88,7 +89,7 @@ export class SampleToolAdmin extends ProxyToolAdmin {
tip.appendChild(document.createElement("hr"));
let defaultTip = await super.getToolTip(hit);
if (typeof defaultTip === "string") {
- const htmlTip = document.createElement("span") as HTMLSpanElement;
+ const htmlTip = document.createElement("span");
htmlTip.innerHTML = defaultTip;
defaultTip = htmlTip;
}
diff --git a/src/frontend-samples/tooltip-customize-sample/TooltipCustomizeUI.tsx b/src/frontend-samples/tooltip-customize-sample/TooltipCustomizeUI.tsx
index 6de8b4b88..e9d877ffd 100644
--- a/src/frontend-samples/tooltip-customize-sample/TooltipCustomizeUI.tsx
+++ b/src/frontend-samples/tooltip-customize-sample/TooltipCustomizeUI.tsx
@@ -32,59 +32,42 @@ export class TooltipCustomizeUI extends React.Component<{ iModelName: string, iM
/** Creates a Sample instance */
constructor(props?: any, context?: any) {
super(props, context);
- // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of this file.
+ // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of TooltipCustomizeApp.tsx.
const toolAdmin = ShowcaseToolAdmin.get().getProxyToolAdmin() as SampleToolAdmin;
this.state = { ...toolAdmin.settings };
}
+ public componentDidUpdate(_prevProps: {}, prevState: TooltipCustomizeSettings) {
+ // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of TooltipCustomizeApp.tsx.
+ const toolAdmin = ShowcaseToolAdmin.get().getProxyToolAdmin() as SampleToolAdmin;
+ if (prevState !== this.state)
+ toolAdmin.settings = this.state;
+ }
+
private _onChangeShowImage = (checked: boolean) => {
- this.setState({ showImage: checked }, () => {
- // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of this file.
- const toolAdmin = ShowcaseToolAdmin.get().getProxyToolAdmin() as SampleToolAdmin;
- toolAdmin.settings.showImage = checked;
- });
+ this.setState({ showImage: checked });
}
private _onChangeShowCustomText = (checked: boolean) => {
- this.setState({ showCustomText: checked }, () => {
- // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of this file.
- const toolAdmin = ShowcaseToolAdmin.get().getProxyToolAdmin() as SampleToolAdmin;
- toolAdmin.settings.showCustomText = checked;
- });
+ this.setState({ showCustomText: checked });
}
private _onChangeShowElementProperty = (checked: boolean) => {
- this.setState({ showElementProperty: checked }, () => {
- // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of this file.
- const toolAdmin = ShowcaseToolAdmin.get().getProxyToolAdmin() as SampleToolAdmin;
- toolAdmin.settings.showElementProperty = checked;
- });
+ this.setState({ showElementProperty: checked });
}
private _onChangeShowDefaultToolTip = (checked: boolean) => {
- this.setState({ showDefaultToolTip: checked }, () => {
- // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of this file.
- const toolAdmin = ShowcaseToolAdmin.get().getProxyToolAdmin() as SampleToolAdmin;
- toolAdmin.settings.showDefaultToolTip = checked;
- });
+ this.setState({ showDefaultToolTip: checked });
}
private _onChangeCustomText = (event: React.ChangeEvent
) => {
const value: string = event.target.value;
- this.setState({ customText: value }, () => {
- // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of this file.
- const toolAdmin = ShowcaseToolAdmin.get().getProxyToolAdmin() as SampleToolAdmin;
- toolAdmin.settings.customText = value;
- });
+ this.setState({ customText: value });
}
private _onChangeElementProperty = (event: React.ChangeEvent) => {
const value = event.target.value as ElemProperty;
- this.setState({ elemProperty: value }, () => {
- // Use "IModelApp.toolAdmin as YourToolAdmin" see Notes at bottom of this file.
- const toolAdmin = ShowcaseToolAdmin.get().getProxyToolAdmin() as SampleToolAdmin;
- toolAdmin.settings.elemProperty = value;
- });
+ this.setState({ elemProperty: value });
}
/** Components for rendering the sample's instructions and controls */
diff --git a/src/frontend-samples/tooltip-customize-sample/sampleSpec.ts b/src/frontend-samples/tooltip-customize-sample/sampleSpec.ts
index 32d2997fc..c233a611a 100644
--- a/src/frontend-samples/tooltip-customize-sample/sampleSpec.ts
+++ b/src/frontend-samples/tooltip-customize-sample/sampleSpec.ts
@@ -14,7 +14,7 @@ export function getTooltipCustomizeSpec(): SampleSpec {
{ name: "TooltipCustomizeApp.tsx", import: import("!!raw-loader!./TooltipCustomizeApp"), entry: true },
{ name: "TooltipCustomizeUI.tsx", import: import("!!raw-loader!./TooltipCustomizeUI") },
],
- setup: TooltipCustomizeApp.setup,
- teardown: TooltipCustomizeApp.teardown,
+ setup: TooltipCustomizeApp.setup.bind(TooltipCustomizeApp),
+ teardown: TooltipCustomizeApp.teardown.bind(TooltipCustomizeApp),
});
}
diff --git a/src/frontend-samples/tree-samples/basic-tree/sampleSpec.ts b/src/frontend-samples/tree-samples/basic-tree/sampleSpec.ts
index 8cf08c94c..677033b34 100644
--- a/src/frontend-samples/tree-samples/basic-tree/sampleSpec.ts
+++ b/src/frontend-samples/tree-samples/basic-tree/sampleSpec.ts
@@ -15,6 +15,6 @@ export function getBasicTreeSpec(): SampleSpec {
files: [
{ name: "BasicTreeApp.tsx", import: import("!!raw-loader!./BasicTreeApp"), entry: true },
],
- setup: BasicTreeApp.setup,
+ setup: BasicTreeApp.setup.bind(BasicTreeApp),
});
}
diff --git a/src/frontend-samples/tree-samples/custom-checkboxes-tree/sampleSpec.ts b/src/frontend-samples/tree-samples/custom-checkboxes-tree/sampleSpec.ts
index 2bd76f876..4ca4f9c44 100644
--- a/src/frontend-samples/tree-samples/custom-checkboxes-tree/sampleSpec.ts
+++ b/src/frontend-samples/tree-samples/custom-checkboxes-tree/sampleSpec.ts
@@ -15,6 +15,6 @@ export function getCustomCheckboxesTreeSpec(): SampleSpec {
files: [
{ name: "CustomCheckboxesTreeApp.tsx", import: import("!!raw-loader!./CustomCheckboxesTreeApp"), entry: true },
],
- setup: CustomCheckboxesTreeApp.setup,
+ setup: CustomCheckboxesTreeApp.setup.bind(CustomCheckboxesTreeApp),
});
}
diff --git a/src/frontend-samples/tree-samples/custom-event-handler-tree/sampleSpec.ts b/src/frontend-samples/tree-samples/custom-event-handler-tree/sampleSpec.ts
index 9c69e2083..0591af95f 100644
--- a/src/frontend-samples/tree-samples/custom-event-handler-tree/sampleSpec.ts
+++ b/src/frontend-samples/tree-samples/custom-event-handler-tree/sampleSpec.ts
@@ -15,6 +15,6 @@ export function getCustomEventHandlerTreeSpec(): SampleSpec {
files: [
{ name: "CustomEventHandlerTreeApp.tsx", import: import("!!raw-loader!./CustomEventHandlerTreeApp"), entry: true },
],
- setup: CustomEventHandlerTreeApp.setup,
+ setup: CustomEventHandlerTreeApp.setup.bind(CustomEventHandlerTreeApp),
});
}
diff --git a/src/frontend-samples/tree-samples/custom-node-loading-tree/CustomNodeLoadingTreeApp.tsx b/src/frontend-samples/tree-samples/custom-node-loading-tree/CustomNodeLoadingTreeApp.tsx
index 28f019204..5a367f3a7 100644
--- a/src/frontend-samples/tree-samples/custom-node-loading-tree/CustomNodeLoadingTreeApp.tsx
+++ b/src/frontend-samples/tree-samples/custom-node-loading-tree/CustomNodeLoadingTreeApp.tsx
@@ -29,7 +29,7 @@ export interface CustomNodeLoadingTreeProps {
}
const PAGING_SIZE = 20;
-const RULESET_TREE_HIERARCHY: Ruleset = require("../TreeHierarchy.json"); // tslint:disable-line: no-var-requires
+const RULESET_TREE_HIERARCHY: Ruleset = require("../TreeHierarchy.json"); // eslint-disable-line @typescript-eslint/no-var-requires
/**
* This component demonstrates how to use `ControlledTree` with custom nodes loading to load nodes from
* multiple data providers. Default node loaders `TreeNodeLoader` and `PagedTreeNodeLoader` works with
diff --git a/src/frontend-samples/tree-samples/custom-node-loading-tree/sampleSpec.ts b/src/frontend-samples/tree-samples/custom-node-loading-tree/sampleSpec.ts
index bd68a59fc..5f6578cef 100644
--- a/src/frontend-samples/tree-samples/custom-node-loading-tree/sampleSpec.ts
+++ b/src/frontend-samples/tree-samples/custom-node-loading-tree/sampleSpec.ts
@@ -13,6 +13,6 @@ export function getCustomNodeLoadingTreeSpec(): SampleSpec {
files: [
{ name: "CustomNodeLoadingTreeApp.tsx", import: import("!!raw-loader!./CustomNodeLoadingTreeApp"), entry: true },
],
- setup: CustomNodeLoadingTreeApp.setup,
+ setup: CustomNodeLoadingTreeApp.setup.bind(CustomNodeLoadingTreeApp),
});
}
diff --git a/src/frontend-samples/tree-samples/custom-table-node-tree/sampleSpec.ts b/src/frontend-samples/tree-samples/custom-table-node-tree/sampleSpec.ts
index 1b6b8cad6..48b80d96b 100644
--- a/src/frontend-samples/tree-samples/custom-table-node-tree/sampleSpec.ts
+++ b/src/frontend-samples/tree-samples/custom-table-node-tree/sampleSpec.ts
@@ -16,6 +16,6 @@ export function getCustomTableNodeTreeSpec(): SampleSpec {
{ name: "CustomTableNodeTreeApp.tsx", import: import("!!raw-loader!./CustomTableNodeTreeApp"), entry: true },
{ name: "TableNodeTree.scss", import: import("!!raw-loader!./TableNodeTree.scss") },
],
- setup: TableNodeTreeApp.setup,
+ setup: TableNodeTreeApp.setup.bind(TableNodeTreeApp),
});
}
diff --git a/src/frontend-samples/tree-samples/custom-webfont-icons-tree/CustomWebfontIconsTreeApp.tsx b/src/frontend-samples/tree-samples/custom-webfont-icons-tree/CustomWebfontIconsTreeApp.tsx
index 9130b29bb..9778c93e6 100644
--- a/src/frontend-samples/tree-samples/custom-webfont-icons-tree/CustomWebfontIconsTreeApp.tsx
+++ b/src/frontend-samples/tree-samples/custom-webfont-icons-tree/CustomWebfontIconsTreeApp.tsx
@@ -11,7 +11,7 @@ import "@fortawesome/fontawesome-free/css/all.css";
import SampleApp from "common/SampleApp";
import { CustomWebfontIconsTreeUI } from "./CustomWebfontIconsTreeUI";
const PAGING_SIZE = 20;
-const RULESET_TREE_WITH_ICONS: Ruleset = require("./TreeWithIcons.json"); // tslint:disable-line: no-var-requires
+const RULESET_TREE_WITH_ICONS: Ruleset = require("./TreeWithIcons.json"); // eslint-disable-line @typescript-eslint/no-var-requires
export interface CustomWebfontIconsTreeProps {
imodel: IModelConnection;
diff --git a/src/frontend-samples/tree-samples/custom-webfont-icons-tree/sampleSpec.tsx b/src/frontend-samples/tree-samples/custom-webfont-icons-tree/sampleSpec.tsx
index c71423153..35020b375 100644
--- a/src/frontend-samples/tree-samples/custom-webfont-icons-tree/sampleSpec.tsx
+++ b/src/frontend-samples/tree-samples/custom-webfont-icons-tree/sampleSpec.tsx
@@ -13,6 +13,6 @@ export function getCustomWebfontIconsTreeSpec(): SampleSpec {
files: [
{ name: "CustomWebfontIconsTreeApp.tsx", import: import("!!raw-loader!./CustomWebfontIconsTreeApp"), entry: true },
],
- setup: CustomWebfontIconsTreeApp.setup,
+ setup: CustomWebfontIconsTreeApp.setup.bind(CustomWebfontIconsTreeApp),
});
}
diff --git a/src/frontend-samples/tree-samples/presentation-tree/PresentationTreeApp.tsx b/src/frontend-samples/tree-samples/presentation-tree/PresentationTreeApp.tsx
index 1e14e0124..f32010d58 100644
--- a/src/frontend-samples/tree-samples/presentation-tree/PresentationTreeApp.tsx
+++ b/src/frontend-samples/tree-samples/presentation-tree/PresentationTreeApp.tsx
@@ -10,7 +10,7 @@ import { Ruleset } from "@bentley/presentation-common";
import SampleApp from "common/SampleApp";
import { PresentationTreeUI } from "./PresentationTreeUI";
const PAGING_SIZE = 20;
-const RULESET_TREE_HIERARCHY: Ruleset = require("../TreeHierarchy.json"); // tslint:disable-line: no-var-requires
+const RULESET_TREE_HIERARCHY: Ruleset = require("../TreeHierarchy.json"); // eslint-disable-line @typescript-eslint/no-var-requires
export interface PresentationTreeProps {
imodel: IModelConnection;
diff --git a/src/frontend-samples/tree-samples/presentation-tree/sampleSpec.ts b/src/frontend-samples/tree-samples/presentation-tree/sampleSpec.ts
index ef391de86..078ddd550 100644
--- a/src/frontend-samples/tree-samples/presentation-tree/sampleSpec.ts
+++ b/src/frontend-samples/tree-samples/presentation-tree/sampleSpec.ts
@@ -13,6 +13,6 @@ export function getPresentationTreeSpec(): SampleSpec {
files: [
{ name: "PresentationTreeApp.tsx", import: import("!!raw-loader!./PresentationTreeApp"), entry: true },
],
- setup: PresentationTreeApp.setup,
+ setup: PresentationTreeApp.setup.bind(PresentationTreeApp),
});
}
diff --git a/src/frontend-samples/tree-samples/unified-selection-tree/UnifiedSelectionTreeApp.tsx b/src/frontend-samples/tree-samples/unified-selection-tree/UnifiedSelectionTreeApp.tsx
index bfe8e7b1c..2804fe461 100644
--- a/src/frontend-samples/tree-samples/unified-selection-tree/UnifiedSelectionTreeApp.tsx
+++ b/src/frontend-samples/tree-samples/unified-selection-tree/UnifiedSelectionTreeApp.tsx
@@ -10,7 +10,7 @@ import { Ruleset } from "@bentley/presentation-common";
import SampleApp from "common/SampleApp";
import { UnifiedSelectionTreeUI } from "./UnifiedSelectionTreeUI";
const PAGING_SIZE = 20;
-const RULESET_TREE_HIERARCHY: Ruleset = require("../TreeHierarchy.json"); // tslint:disable-line: no-var-requires
+const RULESET_TREE_HIERARCHY: Ruleset = require("../TreeHierarchy.json"); // eslint-disable-line @typescript-eslint/no-var-requires
export default class UnifiedSelectionTreeApp extends React.Component<{}> implements SampleApp {
public static async setup(iModelName: string, iModelSelector: React.ReactNode) {
@@ -31,6 +31,7 @@ export interface UnifiedSelectionTreeProps {
* is used. It extends default `TreeEventHandler` and additionally adds/removes keys to/from Unified Selection
* when nodes are selected/deselected and changes tree selection to match Unified Selection.
*/
+// eslint-disable-next-line @typescript-eslint/naming-convention
export function UnifiedSelectionTree(props: UnifiedSelectionTreeProps) {
// create tree node loader to load nodes using presentation rules. It loads nodes to tree model
// in pages using supplied iModel and presentation ruleset.
diff --git a/src/frontend-samples/tree-samples/unified-selection-tree/sampleSpec.ts b/src/frontend-samples/tree-samples/unified-selection-tree/sampleSpec.ts
index c92f6d9e4..3785fb937 100644
--- a/src/frontend-samples/tree-samples/unified-selection-tree/sampleSpec.ts
+++ b/src/frontend-samples/tree-samples/unified-selection-tree/sampleSpec.ts
@@ -13,6 +13,6 @@ export function getUnifiedSelectionTreeSpec(): SampleSpec {
files: [
{ name: "UnifiedSelectionTreeApp.tsx", import: import("!!raw-loader!./UnifiedSelectionTreeApp"), entry: true },
],
- setup: UnifiedSelectionTreeApp.setup,
+ setup: UnifiedSelectionTreeApp.setup.bind(UnifiedSelectionTreeApp),
});
}
diff --git a/src/frontend-samples/view-attributes-sample/ViewAttributesUI.tsx b/src/frontend-samples/view-attributes-sample/ViewAttributesUI.tsx
index e47a286f6..47a6fcbee 100644
--- a/src/frontend-samples/view-attributes-sample/ViewAttributesUI.tsx
+++ b/src/frontend-samples/view-attributes-sample/ViewAttributesUI.tsx
@@ -48,7 +48,8 @@ export default class ViewAttributesUI extends React.Component<{ iModelName: stri
if (undefined === this.state.vp)
return;
- this.setState({ attrValues: ViewAttributesApp.getAttrValues(this.state.vp) });
+ const attrValues = ViewAttributesApp.getAttrValues(this.state.vp);
+ this.setState({ attrValues });
}
// This common function is used to create the react components for each row of the UI.
diff --git a/src/frontend-samples/view-attributes-sample/sampleSpec.ts b/src/frontend-samples/view-attributes-sample/sampleSpec.ts
index 316c7797b..87174910d 100644
--- a/src/frontend-samples/view-attributes-sample/sampleSpec.ts
+++ b/src/frontend-samples/view-attributes-sample/sampleSpec.ts
@@ -14,6 +14,6 @@ export function getViewAttributesSpec(): SampleSpec {
{ name: "ViewAttributesApp.tsx", import: import("!!raw-loader!./ViewAttributesApp"), entry: true },
{ name: "ViewAttributesUI.tsx", import: import("!!raw-loader!./ViewAttributesUI") },
],
- setup: ViewAttributesApp.setup,
+ setup: ViewAttributesApp.setup.bind(ViewAttributesApp),
});
}
diff --git a/src/frontend-samples/view-clip-sample/ViewClipApp.tsx b/src/frontend-samples/view-clip-sample/ViewClipApp.tsx
index 1cf96bfea..04a30a537 100644
--- a/src/frontend-samples/view-clip-sample/ViewClipApp.tsx
+++ b/src/frontend-samples/view-clip-sample/ViewClipApp.tsx
@@ -73,17 +73,15 @@ export default class ViewClipApp implements SampleApp {
public static setClipPlane(vp: ScreenViewport, clipPlane: string, imodel: IModelConnection) {
let rotationType: EditManipulator.RotationType;
switch (clipPlane) {
+ default:
case "0": rotationType = EditManipulator.RotationType.Top; break;
case "1": rotationType = EditManipulator.RotationType.Front; break;
case "2": rotationType = EditManipulator.RotationType.Left; break;
- case "None": {
- this.clearClips(vp);
- return true;
- } default: rotationType = EditManipulator.RotationType.Top; break;
+ case "None": return true;
}
// Get the center point of the displayed extents as a starting point for the clip plane
- const point: Point3d = imodel!.displayedExtents.center;
+ const point: Point3d = imodel.displayedExtents.center;
const normal: Vector3d | undefined = this.getPlaneInwardNormal(rotationType, vp);
const plane: Plane3dByOriginAndUnitNormal | undefined = Plane3dByOriginAndUnitNormal.create(point, normal!);
if (undefined === plane)
diff --git a/src/frontend-samples/view-clip-sample/ViewClipUI.tsx b/src/frontend-samples/view-clip-sample/ViewClipUI.tsx
index 261697cf8..3975c4ba1 100644
--- a/src/frontend-samples/view-clip-sample/ViewClipUI.tsx
+++ b/src/frontend-samples/view-clip-sample/ViewClipUI.tsx
@@ -35,17 +35,38 @@ export class ViewClipUI extends React.Component) => {
- this.setState({ showClipBlock: false, clipPlane: event.target.value });
+ public componentDidUpdate(_prevProps: ViewClipUIProps, prevState: ViewClipUIState) {
+ if (!this.state.imodel)
+ return;
+
const vp = IModelApp.viewManager.selectedView;
if (undefined === vp) {
- return false;
+ return;
}
- if (this.state.imodel) {
- return ViewClipApp.setClipPlane(vp, event.target.value, this.state.imodel);
+
+ if (prevState.showClipBlock !== this.state.showClipBlock ||
+ prevState.clipPlane !== this.state.clipPlane) {
+
+ if (this.state.clipPlane === "None" && !this.state.showClipBlock) {
+ ViewClipApp.clearClips(vp);
+ return;
+ }
+
+ if (this.state.showClipBlock) {
+ // Clear any other clips before adding the clip range
+ ViewClipApp.clearClips(vp);
+ if (!vp.view.getViewClip())
+ ViewClipApp.addExtentsClipRange(vp);
+ return;
+ }
+
+ ViewClipApp.setClipPlane(vp, this.state.clipPlane, this.state.imodel);
}
- return false;
+ }
+
+ /* Handler for plane select */
+ private _onPlaneSelectChange = (event: React.ChangeEvent) => {
+ this.setState({ showClipBlock: false, clipPlane: event.target.value });
}
/* Method for flipping (negating) the current clip plane. */
@@ -76,19 +97,6 @@ export class ViewClipUI extends React.Component {
this.setState({ showClipBlock: showClipRange, clipPlane: "None" });
- const vp = IModelApp.viewManager.selectedView;
- if (undefined === vp) {
- return false;
- }
- // Clear any other clips before adding the clip range
- ViewClipApp.clearClips(vp);
- if (showClipRange) {
- if (!vp.view.getViewClip())
- ViewClipApp.addExtentsClipRange(vp);
- } else {
- ViewClipApp.clearClips(vp);
- }
- return true;
}
public getIsoView = async (imodel: IModelConnection): Promise => {
@@ -108,11 +116,8 @@ export class ViewClipUI extends React.Component {
- this.setState({ imodel });
-
IModelApp.viewManager.onViewOpen.addOnce((_vp: ScreenViewport) => {
- // tslint:disable-next-line no-floating-promises
- this.setState({ imodel, showClipBlock: true }, () => { this._onToggleRangeClip(true); });
+ this.setState({ imodel, showClipBlock: true });
});
}
diff --git a/src/frontend-samples/view-clip-sample/sampleSpec.ts b/src/frontend-samples/view-clip-sample/sampleSpec.ts
index d6db9e619..9b0be97e3 100644
--- a/src/frontend-samples/view-clip-sample/sampleSpec.ts
+++ b/src/frontend-samples/view-clip-sample/sampleSpec.ts
@@ -16,6 +16,6 @@ export function getViewClipSpec(): SampleSpec {
{ name: "ViewClipUI.tsx", import: import("!!raw-loader!./ViewClipUI") },
],
customModelList: [SampleIModels.RetailBuilding, SampleIModels.MetroStation, SampleIModels.BayTown, SampleIModels.House, SampleIModels.Stadium],
- setup: ViewClipApp.setup,
+ setup: ViewClipApp.setup.bind(ViewClipApp),
});
}
diff --git a/src/frontend-samples/viewer-only-2d-sample/ViewerOnly2dUI.tsx b/src/frontend-samples/viewer-only-2d-sample/ViewerOnly2dUI.tsx
index 8408b230e..cb3e95295 100644
--- a/src/frontend-samples/viewer-only-2d-sample/ViewerOnly2dUI.tsx
+++ b/src/frontend-samples/viewer-only-2d-sample/ViewerOnly2dUI.tsx
@@ -55,7 +55,7 @@ export default class ViewerOnly2dUI extends React.Component {
- drawingViews.push();
+ drawingViews.push();
});
return drawingViews;
}
@@ -63,14 +63,14 @@ export default class ViewerOnly2dUI extends React.Component {
- sheetViews.push();
+ sheetViews.push();
});
return sheetViews;
}
/** When a model is selected in above list, get its view and switch to it. */
private _handleSelection = async (event: React.ChangeEvent) => {
- const index = Number.parseInt(event.target.selectedOptions[0].value, undefined);
+ const index = Number.parseInt(event.target.selectedOptions[0].value, 10);
const modelList = event.target.selectedOptions[0].value.includes("sheet") ? this.state.sheets : this.state.drawings;
if (this.state.imodel) {
await ViewerOnly2dApp.changeViewportView(this.state.imodel, modelList[index]);
diff --git a/src/frontend-samples/viewer-only-2d-sample/sampleSpec.ts b/src/frontend-samples/viewer-only-2d-sample/sampleSpec.ts
index 4f0277ebb..8fec4dc1b 100644
--- a/src/frontend-samples/viewer-only-2d-sample/sampleSpec.ts
+++ b/src/frontend-samples/viewer-only-2d-sample/sampleSpec.ts
@@ -17,6 +17,6 @@ export function getViewerOnly2dSpec(): SampleSpec {
{ name: "ViewCreator2d.tsx", import: import("!!raw-loader!./ViewCreator2d") },
],
customModelList: [SampleIModels.House, SampleIModels.MetroStation],
- setup: ViewerOnly2dApp.setup,
+ setup: ViewerOnly2dApp.setup.bind(ViewerOnly2dApp),
});
}
diff --git a/src/frontend-samples/viewport-only-sample/sampleSpec.tsx b/src/frontend-samples/viewport-only-sample/sampleSpec.tsx
index dcde6fc43..569aabdcd 100644
--- a/src/frontend-samples/viewport-only-sample/sampleSpec.tsx
+++ b/src/frontend-samples/viewport-only-sample/sampleSpec.tsx
@@ -14,6 +14,6 @@ export function getViewportOnlySpec(): SampleSpec {
{ name: "ViewportOnlyApp.tsx", import: import("!!raw-loader!./ViewportOnlyApp"), entry: true },
{ name: "ViewportOnlyUI.tsx", import: import("!!raw-loader!./ViewportOnlyUI") },
],
- setup: ViewportOnlyApp.setup,
+ setup: ViewportOnlyApp.setup.bind(ViewportOnlyApp),
});
}
diff --git a/src/frontend-samples/zoom-to-elements-sample/ZoomToElementsUI.tsx b/src/frontend-samples/zoom-to-elements-sample/ZoomToElementsUI.tsx
index bf7478288..4b3b5a9c9 100644
--- a/src/frontend-samples/zoom-to-elements-sample/ZoomToElementsUI.tsx
+++ b/src/frontend-samples/zoom-to-elements-sample/ZoomToElementsUI.tsx
@@ -111,7 +111,7 @@ export default class ZoomToElementsUI extends React.Component {
return (
);
}
@@ -149,7 +149,7 @@ export default class ZoomToElementsUI extends React.Component
-
+
>
);
diff --git a/src/frontend-samples/zoom-to-elements-sample/sampleSpec.ts b/src/frontend-samples/zoom-to-elements-sample/sampleSpec.ts
index 67e896935..65738a2aa 100644
--- a/src/frontend-samples/zoom-to-elements-sample/sampleSpec.ts
+++ b/src/frontend-samples/zoom-to-elements-sample/sampleSpec.ts
@@ -17,6 +17,6 @@ export function getZoomToElementsSpec(): SampleSpec {
{ name: "index.scss", import: import("!!raw-loader!./index.scss") },
],
customModelList: [SampleIModels.BayTown, SampleIModels.RetailBuilding, SampleIModels.MetroStation, SampleIModels.House, SampleIModels.Stadium],
- setup: ZoomToElementsApp.setup,
+ setup: ZoomToElementsApp.setup.bind(ZoomToElementsApp),
});
}
diff --git a/src/index.tsx b/src/index.tsx
index 4086a8979..b6a753a6a 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -19,7 +19,7 @@ import { SampleBaseApp } from "./SampleBaseApp";
,
document.getElementById("root"),
);
-})(); // tslint:disable-line:no-floating-promises
+})();
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
diff --git a/src/raw-loader.d.ts b/src/raw-loader.d.ts
index 13267bf8b..f8d673aa6 100644
--- a/src/raw-loader.d.ts
+++ b/src/raw-loader.d.ts
@@ -2,7 +2,7 @@
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
-declare module '!!raw-loader!*' {
+declare module "!!raw-loader!*" {
const contents: string
export = contents
-}
\ No newline at end of file
+}
diff --git a/src/serviceWorker.ts b/src/serviceWorker.ts
index e65467b3d..a826cdf07 100644
--- a/src/serviceWorker.ts
+++ b/src/serviceWorker.ts
@@ -14,25 +14,23 @@
// To learn more about the benefits of this model and instructions on how to
// opt-in, read https://bit.ly/CRA-PWA
-// tslint:disable
-
const isLocalhost = Boolean(
- window.location.hostname === 'localhost' ||
+ window.location.hostname === "localhost" ||
// [::1] is the IPv6 localhost address.
- window.location.hostname === '[::1]' ||
+ window.location.hostname === "[::1]" ||
// 127.0.0.0/8 are considered localhost for IPv4.
window.location.hostname.match(
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
)
);
-type Config = {
+interface Config {
onSuccess?: (registration: ServiceWorkerRegistration) => void;
onUpdate?: (registration: ServiceWorkerRegistration) => void;
-};
+}
export function register(config?: Config) {
- if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
+ if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) {
// The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(
process.env.PUBLIC_URL!,
@@ -45,7 +43,7 @@ export function register(config?: Config) {
return;
}
- window.addEventListener('load', () => {
+ window.addEventListener("load", () => {
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
if (isLocalhost) {
@@ -55,9 +53,10 @@ export function register(config?: Config) {
// Add some additional logging to localhost, pointing developers to the
// service worker/PWA documentation.
navigator.serviceWorker.ready.then(() => {
+ // eslint-disable-next-line no-console
console.log(
- 'This web app is being served cache-first by a service ' +
- 'worker. To learn more, visit https://bit.ly/CRA-PWA'
+ "This web app is being served cache-first by a service " +
+ "worker. To learn more, visit https://bit.ly/CRA-PWA"
);
});
} else {
@@ -71,21 +70,22 @@ export function register(config?: Config) {
function registerValidSW(swUrl: string, config?: Config) {
navigator.serviceWorker
.register(swUrl)
- .then(registration => {
+ .then((registration) => {
registration.onupdatefound = () => {
const installingWorker = registration.installing;
if (installingWorker == null) {
return;
}
installingWorker.onstatechange = () => {
- if (installingWorker.state === 'installed') {
+ if (installingWorker.state === "installed") {
if (navigator.serviceWorker.controller) {
// At this point, the updated precached content has been fetched,
// but the previous service worker will still serve the older
// content until all client tabs are closed.
+ // eslint-disable-next-line no-console
console.log(
- 'New content is available and will be used when all ' +
- 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
+ "New content is available and will be used when all " +
+ "tabs for this page are closed. See https://bit.ly/CRA-PWA."
);
// Execute callback
@@ -96,7 +96,8 @@ function registerValidSW(swUrl: string, config?: Config) {
// At this point, everything has been precached.
// It's the perfect time to display a
// "Content is cached for offline use." message.
- console.log('Content is cached for offline use.');
+ // eslint-disable-next-line no-console
+ console.log("Content is cached for offline use.");
// Execute callback
if (config && config.onSuccess) {
@@ -107,25 +108,27 @@ function registerValidSW(swUrl: string, config?: Config) {
};
};
})
- .catch(error => {
- console.error('Error during service worker registration:', error);
+ .catch((error) => {
+ // eslint-disable-next-line no-console
+ console.error("Error during service worker registration:", error);
});
}
function checkValidServiceWorker(swUrl: string, config?: Config) {
// Check if the service worker can be found. If it can't reload the page.
fetch(swUrl, {
- headers: { 'Service-Worker': 'script' }
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ headers: { "Service-Worker": "script" },
})
- .then(response => {
+ .then((response) => {
// Ensure service worker exists, and that we really are getting a JS file.
- const contentType = response.headers.get('content-type');
+ const contentType = response.headers.get("content-type");
if (
response.status === 404 ||
- (contentType != null && contentType.indexOf('javascript') === -1)
+ (contentType != null && contentType.indexOf("javascript") === -1)
) {
// No service worker found. Probably a different app. Reload the page.
- navigator.serviceWorker.ready.then(registration => {
+ navigator.serviceWorker.ready.then((registration) => {
registration.unregister().then(() => {
window.location.reload();
});
@@ -136,19 +139,21 @@ function checkValidServiceWorker(swUrl: string, config?: Config) {
}
})
.catch(() => {
+ // eslint-disable-next-line no-console
console.log(
- 'No internet connection found. App is running in offline mode.'
+ "No internet connection found. App is running in offline mode."
);
});
}
export function unregister() {
- if ('serviceWorker' in navigator) {
+ if ("serviceWorker" in navigator) {
navigator.serviceWorker.ready
- .then(registration => {
+ .then((registration) => {
registration.unregister();
})
- .catch(error => {
+ .catch((error) => {
+ // eslint-disable-next-line no-console
console.error(error.message);
});
}
diff --git a/src/test/frontend-sample-showcase.test.tsx b/src/test/frontend-sample-showcase.test.tsx
index 813b187e8..a4d7bf3ff 100644
--- a/src/test/frontend-sample-showcase.test.tsx
+++ b/src/test/frontend-sample-showcase.test.tsx
@@ -3,10 +3,8 @@
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/* eslint-disable @typescript-eslint/no-unused-expressions */
-/* tslint:disable:no-console */
import { expect } from "chai";
import RealityDataApp from "frontend-samples/reality-data-sample/RealityDataApp";
-// tslint:disable-next-line:no-direct-imports
import * as TypeMoq from "typemoq";
import { Range3d } from "@bentley/geometry-core";
import { ContextRealityModelProps } from "@bentley/imodeljs-common";
@@ -26,12 +24,12 @@ describe("View Clipping Sample", () => {
imodelMock.setup((_) => _.displayedExtents).returns(() => new Range3d(1, 1, 1, 1, 1, 1));
});
- after(() => TestApp.shutdown());
+ after(async () => TestApp.shutdown());
it("Adds a view clip plane to the viewport", () => {
const vp: ScreenViewport = TestUtilities.getScreenViewport();
if (vp) {
- ViewClipApp.setClipPlane(vp, "0", imodelMock.object as IModelConnection);
+ ViewClipApp.setClipPlane(vp, "0", imodelMock.object);
expect(vp.view.getViewClip()).to.not.be.undefined;
ViewClipApp.clearClips(vp);
} else {
@@ -59,7 +57,7 @@ describe("Thematic display", () => {
imodelMock.setup((_) => _.displayedExtents).returns(() => new Range3d(1, 1, 1, 1, 1, 1));
});
- after(() => TestApp.shutdown());
+ after(async () => TestApp.shutdown());
it("Turns thematic display on/off", () => {
const vp: ScreenViewport = TestUtilities.getScreenViewport();
@@ -79,7 +77,7 @@ describe("Shadow Study", () => {
imodelMock.setup((_) => _.displayedExtents).returns(() => new Range3d(1, 1, 1, 1, 1, 1));
});
- after(() => TestApp.shutdown());
+ after(async () => TestApp.shutdown());
it("Sets sun time", () => {
const time: number = 123;
@@ -116,7 +114,7 @@ describe("Emphasize Elements", () => {
imodelMock.setup((_) => _.displayedExtents).returns(() => new Range3d(1, 1, 1, 1, 1, 1));
});
- after(() => TestApp.shutdown());
+ after(async () => TestApp.shutdown());
it("Emphasizes some elements", () => {
IModelApp.viewManager.setSelectedView(TestUtilities.getScreenViewport());
@@ -150,7 +148,7 @@ describe("Reality Data", () => {
imodelMock.setup((_) => _.displayedExtents).returns(() => new Range3d(1, 1, 1, 1, 1, 1));
});
- after(() => TestApp.shutdown());
+ after(async () => TestApp.shutdown());
it("Removes reality data models", () => {
IModelApp.viewManager.setSelectedView(TestUtilities.getScreenViewport());
@@ -171,8 +169,7 @@ describe("Reality Data", () => {
models = 0;
// Toggle off all reality models
- // tslint:disable-next-line: no-floating-promises
- RealityDataApp.toggleRealityModel(false, vp, imodelMock.object as IModelConnection);
+ RealityDataApp.toggleRealityModel(false, vp, imodelMock.object);
style = vp.displayStyle.clone();
style.forEachRealityModel(
() => models++,
diff --git a/src/test/utils/testUtilities.ts b/src/test/utils/testUtilities.ts
index 089185659..34c9c84c9 100644
--- a/src/test/utils/testUtilities.ts
+++ b/src/test/utils/testUtilities.ts
@@ -13,8 +13,8 @@ import { BlankConnection, IModelConnection, ScreenViewport, SpatialViewState } f
function createViewDiv() {
const div = document.createElement("div");
assert(null !== div);
- div!.style.width = div!.style.height = "1000px";
- document.body.appendChild(div!);
+ div.style.width = div.style.height = "1000px";
+ document.body.appendChild(div);
return div;
}