From 6ebf19c0c9076b53b99054230f7601106710ce63 Mon Sep 17 00:00:00 2001 From: Jordi Bunster Date: Tue, 5 Oct 2021 09:25:35 -0700 Subject: [PATCH 01/10] Close tab fixes (#1107) * Close tab fixes Ensure that when promoting a new tab to being the 'active' tab (as a consequence of, say, closing the active tab) that the newly promoted tab has a chance to install its buttons and what not. * Set new active tab even if undefined --- src/hooks/useTabs.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hooks/useTabs.ts b/src/hooks/useTabs.ts index 50e1aa10a..9d298b0e2 100644 --- a/src/hooks/useTabs.ts +++ b/src/hooks/useTabs.ts @@ -69,7 +69,11 @@ export const useTabs: UseStore = create((set, get) => ({ if (tab.tabId === activeTab.tabId && tabIndex !== -1) { const tabToTheRight = updatedTabs[tabIndex]; const lastOpenTab = updatedTabs[updatedTabs.length - 1]; - set({ activeTab: tabToTheRight || lastOpenTab }); + const newActiveTab = tabToTheRight ?? lastOpenTab; + set({ activeTab: newActiveTab }); + if (newActiveTab) { + newActiveTab.onActivate(); + } } set({ openedTabs: updatedTabs }); From f7fa3f7c097d8d3c555bf85a3eb27da50f93c4bc Mon Sep 17 00:00:00 2001 From: Karthik chakravarthy <88904658+kcheekuri@users.noreply.github.com> Date: Tue, 5 Oct 2021 16:06:26 -0400 Subject: [PATCH 02/10] Fix Unit Test: Mock the class to its instance (#1117) * mock to instance * Update jest.config.js Co-authored-by: Jordi Bunster --- jest.config.js | 4 ++-- src/Utils/GalleryUtils.test.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jest.config.js b/jest.config.js index 57ec3f489..7e8ceb81e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -37,8 +37,8 @@ module.exports = { global: { branches: 25, functions: 25, - lines: 29.5, - statements: 29.5, + lines: 29, + statements: 29, }, }, diff --git a/src/Utils/GalleryUtils.test.ts b/src/Utils/GalleryUtils.test.ts index 2ba4ac7e3..5b83dd701 100644 --- a/src/Utils/GalleryUtils.test.ts +++ b/src/Utils/GalleryUtils.test.ts @@ -30,7 +30,7 @@ describe("GalleryUtils", () => { }); it("downloadItem shows dialog in data explorer", () => { - const container = {} as Explorer; + const container = new Explorer(); GalleryUtils.downloadItem(container, undefined, galleryItem, undefined); expect(useDialog.getState().visible).toBe(true); From ed1ffb692f270cc4705e7c61c1b4f053de7629c2 Mon Sep 17 00:00:00 2001 From: vaidankarswapnil <81285216+vaidankarswapnil@users.noreply.github.com> Date: Wed, 6 Oct 2021 20:23:46 +0530 Subject: [PATCH 03/10] Fix ally database panel open issue (#1120) --- .../CommandBar/CommandBarComponentButtonFactory.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx b/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx index e56341d80..a1d19e257 100644 --- a/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx +++ b/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx @@ -307,11 +307,18 @@ function createOpenSynapseLinkDialogButton(container: Explorer): CommandButtonCo function createNewDatabase(container: Explorer): CommandButtonComponentProps { const label = "New " + getDatabaseName(); + const newDatabaseButton = document.activeElement as HTMLElement; + return { iconSrc: AddDatabaseIcon, iconAlt: label, onCommandClick: () => - useSidePanel.getState().openSidePanel("New " + getDatabaseName(), ), + useSidePanel + .getState() + .openSidePanel( + "New " + getDatabaseName(), + + ), commandButtonLabel: label, ariaLabel: label, hasPopup: true, From ff498b51e26c28ac0e47fb9e24af582e65ca8376 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Yadav <79906609+sunilyadav840@users.noreply.github.com> Date: Mon, 11 Oct 2021 20:25:21 +0530 Subject: [PATCH 04/10] fixed eslint of Trigger.ts GithubOAuthService.ts etc (#1126) --- .eslintignore | 5 ----- .eslintrc.js | 1 - src/Explorer/Tree/Trigger.ts | 11 +++++++---- src/GitHub/GitHubOAuthService.ts | 4 ++-- src/Juno/JunoClient.test.ts | 30 ++++++++++++++++-------------- src/Juno/JunoClient.ts | 2 +- 6 files changed, 26 insertions(+), 27 deletions(-) diff --git a/.eslintignore b/.eslintignore index 3de1fdee0..5db30dd6a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -115,15 +115,10 @@ src/Explorer/Tree/ObjectId.ts src/Explorer/Tree/ResourceTokenCollection.ts src/Explorer/Tree/StoredProcedure.ts src/Explorer/Tree/TreeComponents.ts -src/Explorer/Tree/Trigger.ts src/Explorer/WaitsForTemplateViewModel.ts src/GitHub/GitHubClient.test.ts src/GitHub/GitHubClient.ts -src/GitHub/GitHubConnector.ts -src/GitHub/GitHubOAuthService.ts src/Index.ts -src/Juno/JunoClient.test.ts -src/Juno/JunoClient.ts src/Platform/Hosted/Authorization.ts src/ReactDevTools.ts src/Shared/Constants.ts diff --git a/.eslintrc.js b/.eslintrc.js index f32961a91..22f294717 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -39,7 +39,6 @@ module.exports = { "@typescript-eslint/switch-exhaustiveness-check": "error", "@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/no-extraneous-class": "error", - "no-null/no-null": "error", "@typescript-eslint/no-explicit-any": "error", "prefer-arrow/prefer-arrow-functions": ["error", { allowStandaloneDeclarations: true }], eqeqeq: "error", diff --git a/src/Explorer/Tree/Trigger.ts b/src/Explorer/Tree/Trigger.ts index 59d05de60..01fc9e044 100644 --- a/src/Explorer/Tree/Trigger.ts +++ b/src/Explorer/Tree/Trigger.ts @@ -22,6 +22,7 @@ export default class Trigger { public triggerType: ko.Observable; public triggerOperation: ko.Observable; + // eslint-disable-next-line @typescript-eslint/no-explicit-any constructor(container: Explorer, collection: ViewModels.Collection, data: any) { this.nodeKind = "Trigger"; this.container = container; @@ -34,7 +35,7 @@ export default class Trigger { this.triggerType = ko.observable(data.triggerType); } - public select() { + public select(): void { useSelectedNode.getState().setSelectedNode(this); TelemetryProcessor.trace(Action.SelectItem, ActionModifiers.Mark, { description: "Trigger node", @@ -43,7 +44,8 @@ export default class Trigger { }); } - public static create(source: ViewModels.Collection, event: MouseEvent) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public static create(source: ViewModels.Collection, _event: MouseEvent): void { const id = useTabs.getState().getTabs(ViewModels.CollectionTabKind.Triggers).length + 1; const trigger = { id: "", @@ -99,7 +101,7 @@ export default class Trigger { } }; - public delete() { + public delete(): void { useDialog.getState().showOkCancelModalDialog( "Confirm delete", "Are you sure you want to delete the trigger?", @@ -110,7 +112,8 @@ export default class Trigger { useTabs.getState().closeTabsByComparator((tab) => tab.node && tab.node.rid === this.rid); this.collection.children.remove(this); }, - (reason) => {} + // eslint-disable-next-line @typescript-eslint/no-empty-function + () => {} ); }, "Cancel", diff --git a/src/GitHub/GitHubOAuthService.ts b/src/GitHub/GitHubOAuthService.ts index 6f800e66d..fb9288c7c 100644 --- a/src/GitHub/GitHubOAuthService.ts +++ b/src/GitHub/GitHubOAuthService.ts @@ -64,7 +64,7 @@ export class GitHubOAuthService { return params.state; } - public async finishOAuth(params: IGitHubConnectorParams) { + public async finishOAuth(params: IGitHubConnectorParams): Promise { try { this.validateState(params.state); const response = await this.junoClient.getGitHubToken(params.code); @@ -113,7 +113,7 @@ export class GitHubOAuthService { return this.state; } - public resetToken() { + public resetToken(): void { this.token(undefined); } diff --git a/src/Juno/JunoClient.test.ts b/src/Juno/JunoClient.test.ts index 299b0d6bb..9893d5c9e 100644 --- a/src/Juno/JunoClient.test.ts +++ b/src/Juno/JunoClient.test.ts @@ -50,7 +50,8 @@ describe("Pinned repos", () => { }); it("updatePinnedRepos invokes pinned repos subscribers", async () => { - const callback = jest.fn().mockImplementation((pinnedRepos: IPinnedRepo[]) => {}); + // eslint-disable-next-line @typescript-eslint/no-empty-function + const callback = jest.fn().mockImplementation(() => {}); junoClient.subscribeToPinnedRepos(callback); const response = await junoClient.updatePinnedRepos(samplePinnedRepos); @@ -60,7 +61,8 @@ describe("Pinned repos", () => { }); it("getPinnedRepos invokes pinned repos subscribers", async () => { - const callback = jest.fn().mockImplementation((pinnedRepos: IPinnedRepo[]) => {}); + // eslint-disable-next-line @typescript-eslint/no-empty-function + const callback = jest.fn().mockImplementation(() => {}); junoClient.subscribeToPinnedRepos(callback); const response = await junoClient.getPinnedRepos("scope"); @@ -153,7 +155,7 @@ describe("Gallery", () => { it("getSampleNotebooks", async () => { window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.getSampleNotebooks(); @@ -165,7 +167,7 @@ describe("Gallery", () => { it("getPublicNotebooks", async () => { window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.getPublicNotebooks(); @@ -178,7 +180,7 @@ describe("Gallery", () => { const id = "id"; window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.getNotebookInfo(id); @@ -191,7 +193,7 @@ describe("Gallery", () => { const id = "id"; window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - text: () => undefined as any, + text: () => undefined as undefined, }); const response = await junoClient.getNotebookContent(id); @@ -204,7 +206,7 @@ describe("Gallery", () => { const id = "id"; window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.increaseNotebookViews(id); @@ -218,7 +220,7 @@ describe("Gallery", () => { const id = "id"; window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.increaseNotebookDownloadCount(id); @@ -243,7 +245,7 @@ describe("Gallery", () => { const id = "id"; window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.favoriteNotebook(id); @@ -268,7 +270,7 @@ describe("Gallery", () => { const id = "id"; window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.unfavoriteNotebook(id); @@ -292,7 +294,7 @@ describe("Gallery", () => { it("getFavoriteNotebooks", async () => { window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.getFavoriteNotebooks(); @@ -315,7 +317,7 @@ describe("Gallery", () => { it("getPublishedNotebooks", async () => { window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.getPublishedNotebooks(); @@ -339,7 +341,7 @@ describe("Gallery", () => { const id = "id"; window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.deleteNotebook(id); @@ -369,7 +371,7 @@ describe("Gallery", () => { const addLinkToNotebookViewer = true; window.fetch = jest.fn().mockReturnValue({ status: HttpStatusCodes.OK, - json: () => undefined as any, + json: () => undefined as undefined, }); const response = await junoClient.publishNotebook(name, description, tags, thumbnailUrl, content); diff --git a/src/Juno/JunoClient.ts b/src/Juno/JunoClient.ts index 9beb1a0c2..1a43cccc6 100644 --- a/src/Juno/JunoClient.ts +++ b/src/Juno/JunoClient.ts @@ -62,7 +62,7 @@ export interface IPublishNotebookRequest { description: string; tags: string[]; thumbnailUrl: string; - content: any; + content: unknown; addLinkToNotebookViewer: boolean; } From 734ee1e436e1f31442eea38a59f9bf4af48d4052 Mon Sep 17 00:00:00 2001 From: vaidankarswapnil <81285216+vaidankarswapnil@users.noreply.github.com> Date: Mon, 11 Oct 2021 20:26:12 +0530 Subject: [PATCH 05/10] Fix eslint issues for ClauseGroup and ClauseGroupViewModel files (#1127) --- .eslintignore | 4 +- .../Tables/QueryBuilder/ClauseGroup.ts | 85 ++++++++++--------- .../QueryBuilder/ClauseGroupViewModel.ts | 4 +- 3 files changed, 47 insertions(+), 46 deletions(-) diff --git a/.eslintignore b/.eslintignore index 5db30dd6a..9c7d849f7 100644 --- a/.eslintignore +++ b/.eslintignore @@ -87,8 +87,8 @@ src/Explorer/Tables/DataTable/TableCommands.ts src/Explorer/Tables/DataTable/TableEntityCache.ts src/Explorer/Tables/DataTable/TableEntityListViewModel.ts src/Explorer/Tables/Entities.ts -src/Explorer/Tables/QueryBuilder/ClauseGroup.ts -src/Explorer/Tables/QueryBuilder/ClauseGroupViewModel.ts +# src/Explorer/Tables/QueryBuilder/ClauseGroup.ts +# src/Explorer/Tables/QueryBuilder/ClauseGroupViewModel.ts src/Explorer/Tables/QueryBuilder/CustomTimestampHelper.ts src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts src/Explorer/Tables/QueryBuilder/QueryClauseViewModel.ts diff --git a/src/Explorer/Tables/QueryBuilder/ClauseGroup.ts b/src/Explorer/Tables/QueryBuilder/ClauseGroup.ts index 6f677756a..6e3aa6afb 100644 --- a/src/Explorer/Tables/QueryBuilder/ClauseGroup.ts +++ b/src/Explorer/Tables/QueryBuilder/ClauseGroup.ts @@ -1,8 +1,9 @@ -import QueryClauseViewModel from "./QueryClauseViewModel"; import * as Utilities from "../Utilities"; +import QueryClauseViewModel from "./QueryClauseViewModel"; export default class ClauseGroup { public isRootGroup: boolean; + //eslint-disable-next-line public children = new Array(); public parentGroup: ClauseGroup; private _id: string; @@ -17,7 +18,7 @@ export default class ClauseGroup { * Flattens the clause tree into an array, depth-first, left to right. */ public flattenClauses(targetArray: ko.ObservableArray): void { - var tempArray = new Array(); + const tempArray = new Array(); this.flattenClausesImpl(this, tempArray); targetArray.removeAll(); @@ -31,10 +32,10 @@ export default class ClauseGroup { newClause.clauseGroup = this; this.children.push(newClause); } else { - var targetGroup = insertBefore.clauseGroup; + const targetGroup = insertBefore.clauseGroup; if (targetGroup) { - var insertBeforeIndex = targetGroup.children.indexOf(insertBefore); + const insertBeforeIndex = targetGroup.children.indexOf(insertBefore); newClause.clauseGroup = targetGroup; targetGroup.children.splice(insertBeforeIndex, 0, newClause); } @@ -42,19 +43,19 @@ export default class ClauseGroup { } public deleteClause(clause: QueryClauseViewModel): void { - var targetGroup = clause.clauseGroup; + const targetGroup = clause.clauseGroup; if (targetGroup) { - var index = targetGroup.children.indexOf(clause); + const index = targetGroup.children.indexOf(clause); targetGroup.children.splice(index, 1); clause.dispose(); if (targetGroup.children.length <= 1 && !targetGroup.isRootGroup) { - var parent = targetGroup.parentGroup; - var targetGroupIndex = parent.children.indexOf(targetGroup); + const parent = targetGroup.parentGroup; + const targetGroupIndex = parent.children.indexOf(targetGroup); if (targetGroup.children.length === 1) { - var orphan = targetGroup.children.shift(); + const orphan = targetGroup.children.shift(); if (orphan instanceof QueryClauseViewModel) { (orphan).clauseGroup = parent; @@ -71,14 +72,14 @@ export default class ClauseGroup { } public removeAll(): void { - var allClauses: QueryClauseViewModel[] = new Array(); + const allClauses: QueryClauseViewModel[] = new Array(); this.flattenClausesImpl(this, allClauses); while (allClauses.length > 0) { allClauses.shift().dispose(); } - + //eslint-disable-next-line this.children = new Array(); } @@ -87,12 +88,12 @@ export default class ClauseGroup { */ public groupSelectedItems(): boolean { // Find the selection start & end, also check for gaps between selected items (if found, cannot proceed). - var selection = this.getCheckedItemsInfo(); + const selection = this.getCheckedItemsInfo(); if (selection.canGroup) { - var newGroup = new ClauseGroup(false, this); + const newGroup = new ClauseGroup(false, this); // Replace the selected items with the new group, and then move the selected items into the new group. - var groupedItems = this.children.splice(selection.begin, selection.end - selection.begin + 1, newGroup); + const groupedItems = this.children.splice(selection.begin, selection.end - selection.begin + 1, newGroup); groupedItems && groupedItems.forEach((element) => { @@ -118,13 +119,13 @@ export default class ClauseGroup { return; } - var parentGroup = this.parentGroup; - var index = parentGroup.children.indexOf(this); + const parentGroup = this.parentGroup; + let index = parentGroup.children.indexOf(this); if (index >= 0) { parentGroup.children.splice(index, 1); - var toPromote = this.children.splice(0, this.children.length); + const toPromote = this.children.splice(0, this.children.length); // Move all children one level up. toPromote && @@ -146,16 +147,16 @@ export default class ClauseGroup { } public findDeepestGroupInChildren(skipIndex?: number): ClauseGroup { - var deepest: ClauseGroup = this; - var level: number = 0; - var func = (currentGroup: ClauseGroup): void => { + let deepest = this; + let level = 0; + const func = (currentGroup: ClauseGroup): void => { level++; if (currentGroup.getCurrentGroupDepth() > deepest.getCurrentGroupDepth()) { deepest = currentGroup; } - for (var i = 0; i < currentGroup.children.length; i++) { - var currentItem = currentGroup.children[i]; + for (let i = 0; i < currentGroup.children.length; i++) { + const currentItem = currentGroup.children[i]; if ((i !== skipIndex || level > 1) && currentItem instanceof ClauseGroup) { func(currentItem); @@ -170,16 +171,16 @@ export default class ClauseGroup { } private getCheckedItemsInfo(): { canGroup: boolean; begin: number; end: number } { - var beginIndex = -1; - var endIndex = -1; + let beginIndex = -1; + let endIndex = -1; // In order to perform group, all selected items must be next to each other. // If one or more items are not selected between the first and the last selected item, the gapFlag will be set to True, meaning cannot perform group. - var gapFlag = false; - var count = 0; + let gapFlag = false; + let count = 0; - for (var i = 0; i < this.children.length; i++) { - var currentItem = this.children[i]; - var subGroupSelectionState: { allSelected: boolean; partiallySelected: boolean; nonSelected: boolean }; + for (let i = 0; i < this.children.length; i++) { + const currentItem = this.children[i]; + let subGroupSelectionState: { allSelected: boolean; partiallySelected: boolean; nonSelected: boolean }; if (currentItem instanceof ClauseGroup) { subGroupSelectionState = (currentItem).getSelectionState(); @@ -235,10 +236,10 @@ export default class ClauseGroup { } private getSelectionState(): { allSelected: boolean; partiallySelected: boolean; nonSelected: boolean } { - var selectedCount = 0; + let selectedCount = 0; - for (var i = 0; i < this.children.length; i++) { - var currentItem = this.children[i]; + for (let i = 0; i < this.children.length; i++) { + const currentItem = this.children[i]; if (currentItem instanceof ClauseGroup && (currentItem).getSelectionState().allSelected) { selectedCount++; @@ -260,8 +261,8 @@ export default class ClauseGroup { } private unselectAll(): void { - for (var i = 0; i < this.children.length; i++) { - var currentItem = this.children[i]; + for (let i = 0; i < this.children.length; i++) { + const currentItem = this.children[i]; if (currentItem instanceof ClauseGroup) { (currentItem).unselectAll(); @@ -278,8 +279,8 @@ export default class ClauseGroup { targetArray.splice(0, targetArray.length); } - for (var i = 0; i < queryGroup.children.length; i++) { - var currentItem = queryGroup.children[i]; + for (let i = 0; i < queryGroup.children.length; i++) { + const currentItem = queryGroup.children[i]; if (currentItem instanceof ClauseGroup) { this.flattenClausesImpl(currentItem, targetArray); @@ -292,13 +293,13 @@ export default class ClauseGroup { } public getTreeDepth(): number { - var currentDepth = this.getCurrentGroupDepth(); + let currentDepth = this.getCurrentGroupDepth(); - for (var i = 0; i < this.children.length; i++) { - var currentItem = this.children[i]; + for (let i = 0; i < this.children.length; i++) { + const currentItem = this.children[i]; if (currentItem instanceof ClauseGroup) { - var newDepth = (currentItem).getTreeDepth(); + const newDepth = (currentItem).getTreeDepth(); if (newDepth > currentDepth) { currentDepth = newDepth; @@ -310,8 +311,8 @@ export default class ClauseGroup { } public getCurrentGroupDepth(): number { - var group = this; - var depth = 0; + let group = this; + let depth = 0; while (!group.isRootGroup) { depth++; diff --git a/src/Explorer/Tables/QueryBuilder/ClauseGroupViewModel.ts b/src/Explorer/Tables/QueryBuilder/ClauseGroupViewModel.ts index 5317a0303..3ea9aade9 100644 --- a/src/Explorer/Tables/QueryBuilder/ClauseGroupViewModel.ts +++ b/src/Explorer/Tables/QueryBuilder/ClauseGroupViewModel.ts @@ -1,7 +1,7 @@ import * as ko from "knockout"; +import * as Constants from "../Constants"; import ClauseGroup from "./ClauseGroup"; import QueryBuilderViewModel from "./QueryBuilderViewModel"; -import * as Constants from "../Constants"; /** * View model for showing group indicators on UI, contains information such as group color and border styles. @@ -38,7 +38,7 @@ export default class ClauseGroupViewModel { }; private getGroupBackgroundColor(group: ClauseGroup): string { - var colorCount = Constants.clauseGroupColors.length; + const colorCount = Constants.clauseGroupColors.length; if (group.isRootGroup) { return Constants.transparentColor; From b67b76cc877fac7f0a7ef3d3f4b538d377a6c1a9 Mon Sep 17 00:00:00 2001 From: vaidankarswapnil <81285216+vaidankarswapnil@users.noreply.github.com> Date: Mon, 11 Oct 2021 20:50:38 +0530 Subject: [PATCH 06/10] Fix eslint issues for QueryBuilderViewModal and QueryClauseViewModel (#1125) --- .eslintignore | 4 +- .../QueryBuilder/QueryBuilderViewModel.ts | 151 ++++++++++-------- .../QueryBuilder/QueryClauseViewModel.ts | 24 +-- 3 files changed, 96 insertions(+), 83 deletions(-) diff --git a/.eslintignore b/.eslintignore index 9c7d849f7..e7565502c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -90,8 +90,8 @@ src/Explorer/Tables/Entities.ts # src/Explorer/Tables/QueryBuilder/ClauseGroup.ts # src/Explorer/Tables/QueryBuilder/ClauseGroupViewModel.ts src/Explorer/Tables/QueryBuilder/CustomTimestampHelper.ts -src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts -src/Explorer/Tables/QueryBuilder/QueryClauseViewModel.ts +# src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts +# src/Explorer/Tables/QueryBuilder/QueryClauseViewModel.ts src/Explorer/Tables/TableDataClient.ts src/Explorer/Tables/TableEntityProcessor.ts src/Explorer/Tables/Utilities.ts diff --git a/src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts b/src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts index 58fdc654a..61dd3fde3 100644 --- a/src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts +++ b/src/Explorer/Tables/QueryBuilder/QueryBuilderViewModel.ts @@ -29,7 +29,7 @@ export default class QueryBuilderViewModel { public removeThisFilterLine = "Remove this filter line"; // localize public groupSelectedClauses = "Group selected clauses"; // localize public clauseArray = ko.observableArray(); // This is for storing the clauses in flattened form queryClauses for easier UI data binding. - public queryClauses = new ClauseGroup(true, null); // The actual data structure containing the clause information. + public queryClauses = new ClauseGroup(true, undefined); // The actual data structure containing the clause information. public columnOptions: ko.ObservableArray; public canGroupClauses = ko.observable(false); @@ -107,7 +107,7 @@ export default class QueryBuilderViewModel { } public setExample() { - var example1 = new QueryClauseViewModel( + const example1 = new QueryClauseViewModel( this, "", "PartitionKey", @@ -121,7 +121,7 @@ export default class QueryBuilderViewModel { //null, true ); - var example2 = new QueryClauseViewModel( + const example2 = new QueryClauseViewModel( this, "And", "RowKey", @@ -140,13 +140,13 @@ export default class QueryBuilderViewModel { } public getODataFilterFromClauses = (): string => { - var filterString: string = ""; - var treeTraversal = (group: ClauseGroup): void => { - for (var i = 0; i < group.children.length; i++) { - var currentItem = group.children[i]; + let filterString = ""; + const treeTraversal = (group: ClauseGroup): void => { + for (let i = 0; i < group.children.length; i++) { + const currentItem = group.children[i]; if (currentItem instanceof QueryClauseViewModel) { - var clause = currentItem; + const clause = currentItem; this.timestampToValue(clause); filterString = filterString.concat( this.constructODataClause( @@ -173,7 +173,7 @@ export default class QueryBuilderViewModel { }; public getSqlFilterFromClauses = (): string => { - var filterString: string = "SELECT * FROM c"; + let filterString = "SELECT * FROM c"; if (this._queryViewModel.selectText() && this._queryViewModel.selectText().length > 0) { filterString = "SELECT"; const selectText = this._queryViewModel && this._queryViewModel.selectText && this._queryViewModel.selectText(); @@ -199,15 +199,15 @@ export default class QueryBuilderViewModel { return filterString; } filterString = filterString.concat(" WHERE"); - var first = true; - var treeTraversal = (group: ClauseGroup): void => { - for (var i = 0; i < group.children.length; i++) { - var currentItem = group.children[i]; + let first = true; + const treeTraversal = (group: ClauseGroup): void => { + for (let i = 0; i < group.children.length; i++) { + const currentItem = group.children[i]; if (currentItem instanceof QueryClauseViewModel) { - var clause = currentItem; - let timeStampValue: string = this.timestampToSqlValue(clause); - var value = clause.value(); + const clause = currentItem; + const timeStampValue: string = this.timestampToSqlValue(clause); + let value = clause.value(); if (!clause.isValue()) { value = timeStampValue; } @@ -240,7 +240,7 @@ export default class QueryBuilderViewModel { const databaseId = this._queryViewModel.queryTablesTab.collection.databaseId; const collectionId = this._queryViewModel.queryTablesTab.collection.id(); const tableToQuery = `${getQuotedCqlIdentifier(databaseId)}.${getQuotedCqlIdentifier(collectionId)}`; - var filterString: string = `SELECT * FROM ${tableToQuery}`; + let filterString = `SELECT * FROM ${tableToQuery}`; if (this._queryViewModel.selectText() && this._queryViewModel.selectText().length > 0) { filterString = "SELECT"; const selectText = this._queryViewModel && this._queryViewModel.selectText && this._queryViewModel.selectText(); @@ -255,15 +255,15 @@ export default class QueryBuilderViewModel { return filterString; } filterString = filterString.concat(" WHERE"); - var first = true; - var treeTraversal = (group: ClauseGroup): void => { - for (var i = 0; i < group.children.length; i++) { - var currentItem = group.children[i]; + let first = true; + const treeTraversal = (group: ClauseGroup): void => { + for (let i = 0; i < group.children.length; i++) { + const currentItem = group.children[i]; if (currentItem instanceof QueryClauseViewModel) { - var clause = currentItem; - let timeStampValue: string = this.timestampToSqlValue(clause); - var value = clause.value(); + const clause = currentItem; + const timeStampValue = this.timestampToSqlValue(clause); + let value = clause.value(); if (!clause.isValue()) { value = timeStampValue; } @@ -293,13 +293,13 @@ export default class QueryBuilderViewModel { }; public updateColumnOptions = (): void => { - let originalHeaders = this.columnOptions(); - let newHeaders = this.tableEntityListViewModel.headers; + // let originalHeaders = this.columnOptions(); + const newHeaders = this.tableEntityListViewModel.headers; this.columnOptions(newHeaders.sort(DataTableUtilities.compareTableColumns)); }; private generateLeftParentheses(clause: QueryClauseViewModel): string { - var result = ""; + let result = ""; if (clause.clauseGroup.isRootGroup || clause.clauseGroup.children.indexOf(clause) !== 0) { return result; @@ -307,7 +307,7 @@ export default class QueryBuilderViewModel { result = result.concat("("); } - var currentGroup: ClauseGroup = clause.clauseGroup; + let currentGroup: ClauseGroup = clause.clauseGroup; while ( !currentGroup.isRootGroup && @@ -322,7 +322,7 @@ export default class QueryBuilderViewModel { } private generateRightParentheses(clause: QueryClauseViewModel): string { - var result = ""; + let result = ""; if ( clause.clauseGroup.isRootGroup || @@ -333,7 +333,7 @@ export default class QueryBuilderViewModel { result = result.concat(")"); } - var currentGroup: ClauseGroup = clause.clauseGroup; + let currentGroup: ClauseGroup = clause.clauseGroup; while ( !currentGroup.isRootGroup && @@ -364,14 +364,17 @@ export default class QueryBuilderViewModel { case Constants.TableType.String: return ` ${clauseRule.toLowerCase()} ${leftParentheses}${propertyName} ${this.operatorConverter( operator + // eslint-disable-next-line no-useless-escape )} \'${value}\'${rightParentheses}`; case Constants.TableType.Guid: return ` ${clauseRule.toLowerCase()} ${leftParentheses}${propertyName} ${this.operatorConverter( operator + // eslint-disable-next-line no-useless-escape )} guid\'${value}\'${rightParentheses}`; case Constants.TableType.Binary: return ` ${clauseRule.toLowerCase()} ${leftParentheses}${propertyName} ${this.operatorConverter( operator + // eslint-disable-next-line no-useless-escape )} binary\'${value}\'${rightParentheses}`; default: return ` ${clauseRule.toLowerCase()} ${leftParentheses}${propertyName} ${this.operatorConverter( @@ -391,9 +394,11 @@ export default class QueryBuilderViewModel { ): string => { if (propertyName === Constants.EntityKeyNames.PartitionKey) { propertyName = TableEntityProcessor.keyProperties.PartitionKey; + // eslint-disable-next-line no-useless-escape return ` ${clauseRule.toLowerCase()} ${leftParentheses}c["${propertyName}"] ${operator} \'${value}\'${rightParentheses}`; } else if (propertyName === Constants.EntityKeyNames.RowKey) { propertyName = TableEntityProcessor.keyProperties.Id; + // eslint-disable-next-line no-useless-escape return ` ${clauseRule.toLowerCase()} ${leftParentheses}c.${propertyName} ${operator} \'${value}\'${rightParentheses}`; } else if (propertyName === Constants.EntityKeyNames.Timestamp) { propertyName = TableEntityProcessor.keyProperties.Timestamp; @@ -403,16 +408,21 @@ export default class QueryBuilderViewModel { } switch (type) { case Constants.TableType.DateTime: + // eslint-disable-next-line no-useless-escape return ` ${clauseRule.toLowerCase()} ${leftParentheses}c.${propertyName}["$v"] ${operator} \'${DateTimeUtilities.convertJSDateToTicksWithPadding( value + // eslint-disable-next-line no-useless-escape )}\'${rightParentheses}`; case Constants.TableType.Int64: + // eslint-disable-next-line no-useless-escape return ` ${clauseRule.toLowerCase()} ${leftParentheses}c.${propertyName}["$v"] ${operator} \'${Utilities.padLongWithZeros( value + // eslint-disable-next-line no-useless-escape )}\'${rightParentheses}`; case Constants.TableType.String: case Constants.TableType.Guid: case Constants.TableType.Binary: + // eslint-disable-next-line no-useless-escape return ` ${clauseRule.toLowerCase()} ${leftParentheses}c.${propertyName}["$v"] ${operator} \'${value}\'${rightParentheses}`; default: return ` ${clauseRule.toLowerCase()} ${leftParentheses}c.${propertyName}["$v"] ${operator} ${value}${rightParentheses}`; @@ -434,6 +444,7 @@ export default class QueryBuilderViewModel { type === Constants.CassandraType.Ascii || type === Constants.CassandraType.Varchar ) { + // eslint-disable-next-line no-useless-escape return ` ${clauseRule.toLowerCase()} ${leftParentheses} ${propertyName} ${operator} \'${value}\'${rightParentheses}`; } return ` ${clauseRule.toLowerCase()} ${leftParentheses} ${propertyName} ${operator} ${value}${rightParentheses}`; @@ -454,7 +465,7 @@ export default class QueryBuilderViewModel { case Constants.Operator.NotEqualTo: return Constants.ODataOperator.NotEqualTo; } - return null; + return undefined; }; public groupClauses = (): void => { @@ -463,11 +474,11 @@ export default class QueryBuilderViewModel { this.updateCanGroupClauses(); }; - public addClauseIndex = (index: number, data: any): void => { + public addClauseIndex = (index: number): void => { if (index < 0) { index = 0; } - var newClause = new QueryClauseViewModel( + const newClause = new QueryClauseViewModel( this, "And", "", @@ -492,28 +503,28 @@ export default class QueryBuilderViewModel { // adds a new clause to the end of the array public addNewClause = (): void => { - this.addClauseIndex(this.clauseArray().length, null); + this.addClauseIndex(this.clauseArray().length); }; - public onAddClauseKeyDown = (index: number, data: any, event: KeyboardEvent, source: any): boolean => { + public onAddClauseKeyDown = (index: number, event: KeyboardEvent): boolean => { if (event.keyCode === KeyCodes.Enter || event.keyCode === KeyCodes.Space) { - this.addClauseIndex(index, data); + this.addClauseIndex(index); event.stopPropagation(); return false; } return true; }; - public onAddNewClauseKeyDown = (source: any, event: KeyboardEvent): boolean => { + public onAddNewClauseKeyDown = (event: KeyboardEvent): boolean => { if (event.keyCode === KeyCodes.Enter || event.keyCode === KeyCodes.Space) { - this.addClauseIndex(this.clauseArray().length - 1, null); + this.addClauseIndex(this.clauseArray().length - 1); event.stopPropagation(); return false; } return true; }; - public deleteClause = (index: number, data: any): void => { + public deleteClause = (index: number): void => { this.deleteClauseImpl(index); if (this.clauseArray().length !== 0) { this.clauseArray()[0].and_or(""); @@ -523,9 +534,9 @@ export default class QueryBuilderViewModel { $(window).resize(); }; - public onDeleteClauseKeyDown = (index: number, data: any, event: KeyboardEvent, source: any): boolean => { + public onDeleteClauseKeyDown = (index: number, event: KeyboardEvent): boolean => { if (event.keyCode === KeyCodes.Enter || event.keyCode === KeyCodes.Space) { - this.deleteClause(index, data); + this.deleteClause(index); event.stopPropagation(); return false; } @@ -539,25 +550,26 @@ export default class QueryBuilderViewModel { * (transparent) or its parent group view models. */ public getClauseGroupViewModels = (clause: QueryClauseViewModel): ClauseGroupViewModel[] => { - var placeHolderGroupViewModel = new ClauseGroupViewModel(this.queryClauses, false, this); - var treeDepth = this.queryClauses.getTreeDepth(); - var groupViewModels = new Array(treeDepth); + const placeHolderGroupViewModel = new ClauseGroupViewModel(this.queryClauses, false, this); + const treeDepth = this.queryClauses.getTreeDepth(); + const groupViewModels = new Array(treeDepth); // Prefill the arry with placeholders. - for (var i = 0; i < groupViewModels.length; i++) { + for (let i = 0; i < groupViewModels.length; i++) { groupViewModels[i] = placeHolderGroupViewModel; } - var currentGroup = clause.clauseGroup; + let currentGroup = clause.clauseGroup; // This function determines whether the path from clause to the current group is on the left most. - var isLeftMostPath = (): boolean => { - var group = clause.clauseGroup; + const isLeftMostPath = (): boolean => { + let group = clause.clauseGroup; if (group.children.indexOf(clause) !== 0) { return false; } + // eslint-disable-next-line no-constant-condition while (true) { if (group.getId() === currentGroup.getId()) { break; @@ -573,13 +585,14 @@ export default class QueryBuilderViewModel { }; // This function determines whether the path from clause to the current group is on the right most. - var isRightMostPath = (): boolean => { - var group = clause.clauseGroup; + const isRightMostPath = (): boolean => { + let group = clause.clauseGroup; if (group.children.indexOf(clause) !== group.children.length - 1) { return false; } + // eslint-disable-next-line no-constant-condition while (true) { if (group.getId() === currentGroup.getId()) { break; @@ -594,26 +607,26 @@ export default class QueryBuilderViewModel { return true; }; - var vmIndex = groupViewModels.length - 1; - var skipIndex = -1; - var lastDepth = clause.groupDepth; + let vmIndex = groupViewModels.length - 1; + let skipIndex = -1; + let lastDepth = clause.groupDepth; while (!currentGroup.isRootGroup) { // The current group will be rendered at least once, and if there are any sibling groups deeper // than the current group, we will repeat rendering the current group to fill up the gap between // current & deepest sibling. - var deepestInSiblings = currentGroup.findDeepestGroupInChildren(skipIndex).getCurrentGroupDepth(); + const deepestInSiblings = currentGroup.findDeepestGroupInChildren(skipIndex).getCurrentGroupDepth(); // Find out the depth difference between the deepest group under the siblings of currentGroup and // the deepest group under currentGroup. If the result n is a positive number, it means there are // deeper groups in siblings and we need to draw n + 1 group blocks on UI to fill up the depth // differences. If the result n is a negative number, it means current group contains the deepest // sub-group, we only need to draw the group block once. - var repeatCount = Math.max(deepestInSiblings - lastDepth, 0); + const repeatCount = Math.max(deepestInSiblings - lastDepth, 0); - for (var i = 0; i <= repeatCount; i++) { - var isLeftMost = isLeftMostPath(); - var isRightMost = isRightMostPath(); - var groupViewModel = new ClauseGroupViewModel(currentGroup, i === 0 && isLeftMost, this); + for (let i = 0; i <= repeatCount; i++) { + const isLeftMost = isLeftMostPath(); + const isRightMost = isRightMostPath(); + const groupViewModel = new ClauseGroupViewModel(currentGroup, i === 0 && isLeftMost, this); groupViewModel.showTopBorder(isLeftMost); groupViewModel.showBottomBorder(isRightMost); @@ -635,9 +648,9 @@ export default class QueryBuilderViewModel { }; public addCustomRange(timestamp: CustomTimestampHelper.ITimestampQuery, clauseToAdd: QueryClauseViewModel): void { - var index = this.clauseArray.peek().indexOf(clauseToAdd); + const index = this.clauseArray.peek().indexOf(clauseToAdd); - var newClause = new QueryClauseViewModel( + const newClause = new QueryClauseViewModel( this, //this._tableEntityListViewModel.tableExplorerContext.hostProxy, "And", @@ -662,10 +675,10 @@ export default class QueryBuilderViewModel { } private scrollToBottom(): void { - var scrollBox = document.getElementById("scroll"); + const scrollBox = document.getElementById("scroll"); if (!this.scrollEventListener) { scrollBox.addEventListener("scroll", function () { - var translate = "translate(0," + this.scrollTop + "px)"; + const translate = "translate(0," + this.scrollTop + "px)"; const allTh = >this.querySelectorAll("thead td"); for (let i = 0; i < allTh.length; i++) { allTh[i].style.transform = translate; @@ -673,7 +686,7 @@ export default class QueryBuilderViewModel { }); this.scrollEventListener = true; } - var isScrolledToBottom = scrollBox.scrollHeight - scrollBox.clientHeight <= scrollBox.scrollHeight + 1; + const isScrolledToBottom = scrollBox.scrollHeight - scrollBox.clientHeight <= scrollBox.scrollHeight + 1; if (isScrolledToBottom) { scrollBox.scrollTop = scrollBox.scrollHeight - scrollBox.clientHeight; } @@ -685,8 +698,8 @@ export default class QueryBuilderViewModel { } private deleteClauseImpl(index: number): void { - var clause = this.clauseArray()[index]; - var previousClause = index === 0 ? 0 : index - 1; + const clause = this.clauseArray()[index]; + const previousClause = index === 0 ? 0 : index - 1; this.queryClauses.deleteClause(clause); this.updateClauseArray(); if (this.clauseArray()[previousClause]) { @@ -731,7 +744,7 @@ export default class QueryBuilderViewModel { private timestampToSqlValue(clause: QueryClauseViewModel): string { if (clause.isValue()) { - return null; + return undefined; } else if (clause.isTimestamp()) { return this.getTimeStampToSqlQuery(clause); // } else if (clause.isCustomLastTimestamp()) { @@ -743,7 +756,7 @@ export default class QueryBuilderViewModel { return clause.customTimeValue(); } } - return null; + return undefined; } private getTimeStampToQuery(clause: QueryClauseViewModel): void { @@ -789,7 +802,7 @@ export default class QueryBuilderViewModel { case Constants.timeOptions.currentYear: return CustomTimestampHelper._queryCurrentYearLocal(); } - return null; + return undefined; } public checkIfClauseChanged(): void { diff --git a/src/Explorer/Tables/QueryBuilder/QueryClauseViewModel.ts b/src/Explorer/Tables/QueryBuilder/QueryClauseViewModel.ts index 8acd74518..2e4e6b689 100644 --- a/src/Explorer/Tables/QueryBuilder/QueryClauseViewModel.ts +++ b/src/Explorer/Tables/QueryBuilder/QueryClauseViewModel.ts @@ -14,7 +14,7 @@ export default class QueryClauseViewModel { public field: ko.Observable; public type: ko.Observable; public operator: ko.Observable; - public value: ko.Observable; + public value: ko.Observable; public timeValue: ko.Observable; public customTimeValue: ko.Observable; public canAnd: ko.Observable; @@ -39,7 +39,7 @@ export default class QueryClauseViewModel { field: string, type: string, operator: string, - value: any, + value: string, canAnd: boolean, timeValue: string, customTimeValue: string, @@ -88,30 +88,30 @@ export default class QueryClauseViewModel { userContext.apiType !== "Cassandra" ); - this.and_or.subscribe((value) => { + this.and_or.subscribe(() => { this._queryBuilderViewModel.checkIfClauseChanged(); }); - this.field.subscribe((value) => { + this.field.subscribe(() => { this.changeField(); }); - this.type.subscribe((value) => { + this.type.subscribe(() => { this.changeType(); }); - this.timeValue.subscribe((value) => { + this.timeValue.subscribe(() => { // if (this.timeValue() === QueryBuilderConstants.timeOptions.custom) { // this.customTimestampDialog(); // } }); - this.customTimeValue.subscribe((value) => { + this.customTimeValue.subscribe(() => { this._queryBuilderViewModel.checkIfClauseChanged(); }); - this.value.subscribe((value) => { + this.value.subscribe(() => { this._queryBuilderViewModel.checkIfClauseChanged(); }); - this.operator.subscribe((value) => { + this.operator.subscribe(() => { this._queryBuilderViewModel.checkIfClauseChanged(); }); - this._groupCheckSubscription = this.checkedForGrouping.subscribe((value) => { + this._groupCheckSubscription = this.checkedForGrouping.subscribe(() => { this._queryBuilderViewModel.updateCanGroupClauses(); }); this.isAndOrFocused = ko.observable(false); @@ -280,7 +280,7 @@ export default class QueryClauseViewModel { this._groupCheckSubscription.dispose(); } - this.clauseGroup = null; - this._queryBuilderViewModel = null; + this.clauseGroup = undefined; + this._queryBuilderViewModel = undefined; } } From 882f0e15541e57027320a5c1174359ec873a6be6 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Yadav <79906609+sunilyadav840@users.noreply.github.com> Date: Mon, 11 Oct 2021 20:51:52 +0530 Subject: [PATCH 07/10] fixed GraphExplorer.tsx ellint issue (#1124) --- .eslintignore | 2 +- .../GraphExplorerComponent/GraphExplorer.tsx | 168 +++++++++--------- 2 files changed, 89 insertions(+), 81 deletions(-) diff --git a/.eslintignore b/.eslintignore index e7565502c..c5fa9c4c7 100644 --- a/.eslintignore +++ b/.eslintignore @@ -138,7 +138,7 @@ src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx src/Explorer/Controls/NotebookViewer/NotebookViewerComponent.tsx src/Explorer/Controls/TreeComponent/TreeComponent.tsx src/Explorer/Graph/GraphExplorerComponent/GraphExplorer.test.tsx -src/Explorer/Graph/GraphExplorerComponent/GraphExplorer.tsx +; src/Explorer/Graph/GraphExplorerComponent/GraphExplorer.tsx src/Explorer/Graph/GraphExplorerComponent/GraphVizComponent.tsx src/Explorer/Graph/GraphExplorerComponent/LeftPaneComponent.tsx src/Explorer/Graph/GraphExplorerComponent/MiddlePaneComponent.tsx diff --git a/src/Explorer/Graph/GraphExplorerComponent/GraphExplorer.tsx b/src/Explorer/Graph/GraphExplorerComponent/GraphExplorer.tsx index cf2fbbb3a..56be3822f 100644 --- a/src/Explorer/Graph/GraphExplorerComponent/GraphExplorer.tsx +++ b/src/Explorer/Graph/GraphExplorerComponent/GraphExplorer.tsx @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { FeedOptions, ItemDefinition, QueryIterator, Resource } from "@azure/cosmos"; import * as Q from "q"; import * as React from "react"; @@ -294,8 +296,6 @@ export class GraphExplorer extends React.Component { @@ -422,7 +422,7 @@ export class GraphExplorer extends React.Component { + return promise.then(() => { if (offsetIndex >= GraphExplorer.LOAD_PAGE_SIZE || !vertex._outEAllLoaded || !vertex._inEAllLoaded) { vertex._pagination = { total: @@ -754,7 +753,7 @@ export class GraphExplorer extends React.Component { + public createNewEdge(e: GraphNewEdgeData): Q.Promise { const q = `g.V('${GraphUtil.escapeSingleQuotes(e.inputOutV)}').addE('${GraphUtil.escapeSingleQuotes( e.label )}').To(g.V('${GraphUtil.escapeSingleQuotes(e.inputInV)}'))`; @@ -772,8 +771,8 @@ export class GraphExplorer extends React.Component { + public removeEdge(edgeId: string): Q.Promise { return this.submitToBackend(`g.E('${GraphUtil.escapeSingleQuotes(edgeId)}').drop()`).then( () => { - let graphData = this.originalGraphData; + const graphData = this.originalGraphData; graphData.removeEdge(edgeId, false); this.updateGraphData(graphData, this.state.igraphConfig); }, @@ -826,10 +825,14 @@ export class GraphExplorer extends React.Component 0) { - let v0 = vertices[0]; - if (!v0.hasOwnProperty("id") || !v0.hasOwnProperty("type") || v0.type !== "vertex") { + const v0 = vertices[0]; + if ( + !Object.prototype.hasOwnProperty.call(v0, "id") || + !Object.prototype.hasOwnProperty.call(v0, "type") || + v0.type !== "vertex" + ) { return false; } } @@ -837,7 +840,7 @@ export class GraphExplorer extends React.Component void) { - let errorDataStr: string = ""; + let errorDataStr = ""; if (errorData && errorData.length > 0) { console.error(msg, errorData); errorDataStr = ": " + JSON.stringify(errorData); @@ -1161,12 +1164,15 @@ export class GraphExplorer extends React.Component { - $.each(documents, (index: number, doc: any) => { - newIconsMap[doc["_graph_icon_property_value"]] = { - data: doc["icon"], - format: doc["format"], - }; - }); + $.each( + documents, + (index: number, doc: { _graph_icon_property_value: string; icon: string; format: string }) => { + newIconsMap[doc["_graph_icon_property_value"]] = { + data: doc["icon"], + format: doc["format"], + }; + } + ); // Update graph configuration this.setState({ @@ -1223,8 +1229,8 @@ export class GraphExplorer extends React.Component { - let result = GraphData.GraphData.getNodePropValue(value, key); + (value: any): LeftPane.CaptionId => { + const result = GraphData.GraphData.getNodePropValue(value, key); return { caption: result !== undefined ? result : value.id, id: value.id, @@ -1237,7 +1243,7 @@ export class GraphExplorer extends React.Component { + private selectRootNode(id: string): Q.Promise { if (!this.d3ForceGraph) { console.warn("Attempting to reset zoom, but d3ForceGraph not initialized, yet."); } else { @@ -1282,7 +1288,7 @@ export class GraphExplorer extends React.Component { + (reason: string) => { GraphExplorer.reportToConsole(ConsoleDataType.Error, `Failed to select root node. Reason:${reason}`); } ); @@ -1349,10 +1355,10 @@ export class GraphExplorer extends React.Component 0 && - v.properties[this.props.collectionPartitionKeyProperty][0].hasOwnProperty("value") + Object.prototype.hasOwnProperty.call(v.properties[this.props.collectionPartitionKeyProperty][0], "value") ) { const pk = v.properties[this.props.collectionPartitionKeyProperty][0].value; return GraphExplorer.generatePkIdPair(pk, v.id); @@ -1370,8 +1376,8 @@ export class GraphExplorer extends React.Component 0) { @@ -1425,7 +1431,7 @@ export class GraphExplorer extends React.Component { - let possibleVertices = [] as PossibleVertex[]; + const possibleVertices = [] as PossibleVertex[]; $.each(documents, (index: number, item: any) => { if (highlightedNodeId && item.id === highlightedNodeId) { // Exclude highlighed node in the list @@ -1439,7 +1445,7 @@ export class GraphExplorer extends React.Component { - let promises = []; + private editGraphEdges(editedEdges: EditedEdges): Q.Promise { + const promises = []; // Drop edges for (let i = 0; i < editedEdges.droppedIds.length; i++) { - let id = editedEdges.droppedIds[i]; + const id = editedEdges.droppedIds[i]; promises.push(this.removeEdge(id)); } // Add edges for (let i = 0; i < editedEdges.addedEdges.length; i++) { - let e = editedEdges.addedEdges[i]; + const e = editedEdges.addedEdges[i]; promises.push( this.createNewEdge(e).then(() => { // Reload neighbors in case we linked to a vertex that isn't loaded in the graph @@ -1525,7 +1531,9 @@ export class GraphExplorer extends React.Component { - for (var p in item) { + for (const p in item) { // DocDB: Exclude type because it's always 'vertex' if (p !== "type" && typeof (item as any)[p] === "string") { props[p] = true; } } // Inspect properties - if (item.hasOwnProperty("properties")) { + if (Object.prototype.hasOwnProperty.call(item, "properties")) { // TODO This is DocDB-graph specific // Assume each property value is [{value:... }] - for (var f in item.properties) { + for (const f in item.properties) { props[f] = true; } } @@ -1570,21 +1578,21 @@ export class GraphExplorer extends React.Component gremlinProperty.value); } // update neighbors - let sources: NeighborVertexBasicInfo[] = []; - let targets: NeighborVertexBasicInfo[] = []; + const sources: NeighborVertexBasicInfo[] = []; + const targets: NeighborVertexBasicInfo[] = []; this.props.onResetDefaultGraphConfigValues(); - let nodeCaption = this.state.igraphConfigUiData.nodeCaptionChoice; + const nodeCaption = this.state.igraphConfigUiData.nodeCaptionChoice; this.updateSelectedNodeNeighbors(data.id, nodeCaption, sources, targets); - let sData: GraphHighlightedNodeData = { + const sData: GraphHighlightedNodeData = { id: data.id, label: data.label, properties: props, @@ -1611,16 +1619,16 @@ export class GraphExplorer extends React.Component { @@ -1629,7 +1637,7 @@ export class GraphExplorer extends React.Component { @@ -1648,7 +1656,7 @@ export class GraphExplorer extends React.Component { + (value: string): InputTypeaheadComponent.Item => { return { caption: value, value: value }; } ), @@ -1681,20 +1689,20 @@ export class GraphExplorer extends React.Component this.processGremlinQueryResults(result)) - .catch((error: any) => { + .catch((error: Error) => { const errorMsg = `Failed to process query result: ${getErrorMessage(error)}`; GraphExplorer.reportToConsole(ConsoleDataType.Error, errorMsg); this.setState({ From df3b18d585c9e433b70a5e58ad61f7d047e1158e Mon Sep 17 00:00:00 2001 From: Sunil Kumar Yadav <79906609+sunilyadav840@users.noreply.github.com> Date: Mon, 11 Oct 2021 20:59:21 +0530 Subject: [PATCH 08/10] fixed eslint of NotebookComponentBootstrapper and NotebookReadOnlyRenderer (#1122) --- .eslintignore | 4 ++-- .../NotebookComponentBootstrapper.tsx | 21 +++++++++++++++---- .../NotebookReadOnlyRenderer.tsx | 14 +++++++------ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/.eslintignore b/.eslintignore index c5fa9c4c7..f8d1587bb 100644 --- a/.eslintignore +++ b/.eslintignore @@ -148,10 +148,10 @@ src/Explorer/Graph/GraphExplorerComponent/ReadOnlyNodePropertiesComponent.test.t src/Explorer/Graph/GraphExplorerComponent/ReadOnlyNodePropertiesComponent.tsx src/Explorer/Menus/CommandBar/CommandBarUtil.tsx src/Explorer/Notebook/NotebookComponent/NotebookComponentAdapter.tsx -src/Explorer/Notebook/NotebookComponent/NotebookComponentBootstrapper.tsx +; src/Explorer/Notebook/NotebookComponent/NotebookComponentBootstrapper.tsx src/Explorer/Notebook/NotebookComponent/VirtualCommandBarComponent.tsx src/Explorer/Notebook/NotebookComponent/contents/index.tsx -src/Explorer/Notebook/NotebookRenderer/NotebookReadOnlyRenderer.tsx +; src/Explorer/Notebook/NotebookRenderer/NotebookReadOnlyRenderer.tsx src/Explorer/Notebook/NotebookRenderer/NotebookRenderer.tsx src/Explorer/Notebook/NotebookRenderer/decorators/draggable/index.tsx src/Explorer/Notebook/NotebookRenderer/decorators/hijack-scroll/index.tsx diff --git a/src/Explorer/Notebook/NotebookComponent/NotebookComponentBootstrapper.tsx b/src/Explorer/Notebook/NotebookComponent/NotebookComponentBootstrapper.tsx index 2abbc3618..068c63a2f 100644 --- a/src/Explorer/Notebook/NotebookComponent/NotebookComponentBootstrapper.tsx +++ b/src/Explorer/Notebook/NotebookComponent/NotebookComponentBootstrapper.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { CellId, CellType, ImmutableNotebook } from "@nteract/commutable"; // Vendor modules import { @@ -30,6 +31,19 @@ export interface NotebookComponentBootstrapperOptions { contentRef: ContentRef; } +interface IWrapModel { + name: string; + path: string; + last_modified: Date; + created: string; + content: unknown; + format: string; + mimetype: unknown; + size: number; + writeable: boolean; + type: string; +} + export class NotebookComponentBootstrapper { public contentRef: ContentRef; protected renderExtraComponent: () => JSX.Element; @@ -41,7 +55,7 @@ export class NotebookComponentBootstrapper { this.contentRef = options.contentRef; } - protected static wrapModelIntoContent(name: string, path: string, content: any) { + protected static wrapModelIntoContent(name: string, path: string, content: unknown): IWrapModel { return { name, path, @@ -49,7 +63,7 @@ export class NotebookComponentBootstrapper { created: "", content, format: "json", - mimetype: null as any, + mimetype: undefined, size: 0, writeable: false, type: "notebook", @@ -85,7 +99,7 @@ export class NotebookComponentBootstrapper { }; } - public setContent(name: string, content: any): void { + public setContent(name: string, content: unknown): void { this.getStore().dispatch( actions.fetchContentFulfilled({ filepath: undefined, @@ -270,7 +284,6 @@ export class NotebookComponentBootstrapper { public isContentDirty(): boolean { const content = selectors.content(this.getStore().getState(), { contentRef: this.contentRef }); if (!content) { - console.log("No error"); return false; } diff --git a/src/Explorer/Notebook/NotebookRenderer/NotebookReadOnlyRenderer.tsx b/src/Explorer/Notebook/NotebookRenderer/NotebookReadOnlyRenderer.tsx index f912acd4a..74ae68b2c 100644 --- a/src/Explorer/Notebook/NotebookRenderer/NotebookReadOnlyRenderer.tsx +++ b/src/Explorer/Notebook/NotebookRenderer/NotebookReadOnlyRenderer.tsx @@ -16,9 +16,10 @@ import "./NotebookReadOnlyRenderer.less"; import SandboxOutputs from "./outputs/SandboxOutputs"; export interface NotebookRendererProps { - contentRef: any; + contentRef: ContentRef; hideInputs?: boolean; hidePrompts?: boolean; + addTransform: (component: React.ComponentType & { MIMETYPE: string }) => void; } /** @@ -27,7 +28,7 @@ export interface NotebookRendererProps { class NotebookReadOnlyRenderer extends React.Component { componentDidMount() { if (!userContext.features.sandboxNotebookOutputs) { - loadTransform(this.props as any); + loadTransform(this.props as NotebookRendererProps); } } @@ -59,7 +60,7 @@ class NotebookReadOnlyRenderer extends React.Component {
{{ - code: ({ id, contentRef }: { id: any; contentRef: ContentRef }) => ( + code: ({ id, contentRef }: { id: string; contentRef: ContentRef }) => ( {{ prompt: (props: { id: string; contentRef: string }) => this.renderPrompt(props.id, props.contentRef), @@ -73,14 +74,14 @@ class NotebookReadOnlyRenderer extends React.Component { }} ), - markdown: ({ id, contentRef }: { id: any; contentRef: ContentRef }) => ( + markdown: ({ id, contentRef }: { id: string; contentRef: ContentRef }) => ( {{ editor: {}, }} ), - raw: ({ id, contentRef }: { id: any; contentRef: ContentRef }) => ( + raw: ({ id, contentRef }: { id: string; contentRef: ContentRef }) => ( {{ editor: { @@ -98,6 +99,7 @@ class NotebookReadOnlyRenderer extends React.Component { } } +// eslint-disable-next-line @typescript-eslint/no-unused-vars const makeMapDispatchToProps = (initialDispatch: Dispatch, initialProps: NotebookRendererProps) => { const mapDispatchToProps = (dispatch: Dispatch) => { return { @@ -114,4 +116,4 @@ const makeMapDispatchToProps = (initialDispatch: Dispatch, initialProps: Noteboo return mapDispatchToProps; }; -export default connect(null, makeMapDispatchToProps)(NotebookReadOnlyRenderer); +export default connect(undefined, makeMapDispatchToProps)(NotebookReadOnlyRenderer); From 1c544597080c59a9f604acd92c1dcb73aafd0593 Mon Sep 17 00:00:00 2001 From: victor-meng <56978073+victor-meng@users.noreply.github.com> Date: Mon, 11 Oct 2021 12:09:38 -0700 Subject: [PATCH 09/10] If unsharded is checked, set partition key to undefined (#1128) --- src/Explorer/Panes/AddCollectionPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Explorer/Panes/AddCollectionPanel.tsx b/src/Explorer/Panes/AddCollectionPanel.tsx index 170a8a925..56a76fc97 100644 --- a/src/Explorer/Panes/AddCollectionPanel.tsx +++ b/src/Explorer/Panes/AddCollectionPanel.tsx @@ -999,7 +999,7 @@ export class AddCollectionPanel extends React.Component Date: Tue, 12 Oct 2021 20:08:34 +0530 Subject: [PATCH 10/10] absulte_path setting (#984) * absulte_path setting * resolve build time error --- .vscode/settings.json | 3 +- jest.config.js | 2 ++ src/Explorer/Panes/AddCollectionPanel.tsx | 28 +++++++++---------- .../CassandraAddCollectionPane.tsx | 18 ++++++------ .../DeleteCollectionConfirmationPane.tsx | 26 ++++++++--------- .../Panes/DeleteDatabaseConfirmationPanel.tsx | 24 ++++++++-------- .../Panes/SettingsPane/SettingsPane.tsx | 16 +++++------ .../Panes/StringInputPane/StringInputPane.tsx | 6 ++-- .../Panes/UploadFilePane/UploadFilePane.tsx | 6 ++-- .../Panes/UploadItemsPane/UploadItemsPane.tsx | 6 ++-- tsconfig.json | 22 ++++----------- webpack.config.js | 1 + 12 files changed, 76 insertions(+), 82 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ba70984cf..0716cae8f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,5 +22,6 @@ "editor.codeActionsOnSave": { "source.fixAll.eslint": true, "source.organizeImports": true - } + }, + "typescript.preferences.importModuleSpecifier": "non-relative" } diff --git a/jest.config.js b/jest.config.js index 7e8ceb81e..e08536252 100644 --- a/jest.config.js +++ b/jest.config.js @@ -129,6 +129,8 @@ module.exports = { // The test environment that will be used for testing // testEnvironment: "jest-environment-jsdom", + modulePaths: ["node_modules", "/src"], + // Options that will be passed to the testEnvironment // testEnvironmentOptions: {}, diff --git a/src/Explorer/Panes/AddCollectionPanel.tsx b/src/Explorer/Panes/AddCollectionPanel.tsx index 56a76fc97..028b3c426 100644 --- a/src/Explorer/Panes/AddCollectionPanel.tsx +++ b/src/Explorer/Panes/AddCollectionPanel.tsx @@ -13,21 +13,21 @@ import { Text, TooltipHost, } from "@fluentui/react"; +import * as Constants from "Common/Constants"; +import { createCollection } from "Common/dataAccess/createCollection"; +import { getErrorMessage, getErrorStack } from "Common/ErrorHandlingUtils"; +import { configContext, Platform } from "ConfigContext"; +import * as DataModels from "Contracts/DataModels"; +import { SubscriptionType } from "Contracts/SubscriptionType"; +import { useSidePanel } from "hooks/useSidePanel"; import React from "react"; -import * as Constants from "../../Common/Constants"; -import { createCollection } from "../../Common/dataAccess/createCollection"; -import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils"; -import { configContext, Platform } from "../../ConfigContext"; -import * as DataModels from "../../Contracts/DataModels"; -import { SubscriptionType } from "../../Contracts/SubscriptionType"; -import { useSidePanel } from "../../hooks/useSidePanel"; -import { CollectionCreation } from "../../Shared/Constants"; -import { Action } from "../../Shared/Telemetry/TelemetryConstants"; -import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor"; -import { userContext } from "../../UserContext"; -import { getCollectionName } from "../../Utils/APITypeUtils"; -import { isCapabilityEnabled, isServerlessAccount } from "../../Utils/CapabilityUtils"; -import { getUpsellMessage } from "../../Utils/PricingUtils"; +import { CollectionCreation } from "Shared/Constants"; +import { Action } from "Shared/Telemetry/TelemetryConstants"; +import * as TelemetryProcessor from "Shared/Telemetry/TelemetryProcessor"; +import { userContext } from "UserContext"; +import { getCollectionName } from "Utils/APITypeUtils"; +import { isCapabilityEnabled, isServerlessAccount } from "Utils/CapabilityUtils"; +import { getUpsellMessage } from "Utils/PricingUtils"; import { CollapsibleSectionComponent } from "../Controls/CollapsiblePanel/CollapsibleSectionComponent"; import { ThroughputInput } from "../Controls/ThroughputInput/ThroughputInput"; import Explorer from "../Explorer"; diff --git a/src/Explorer/Panes/CassandraAddCollectionPane/CassandraAddCollectionPane.tsx b/src/Explorer/Panes/CassandraAddCollectionPane/CassandraAddCollectionPane.tsx index 69e84ee03..64ee3fb3f 100644 --- a/src/Explorer/Panes/CassandraAddCollectionPane/CassandraAddCollectionPane.tsx +++ b/src/Explorer/Panes/CassandraAddCollectionPane/CassandraAddCollectionPane.tsx @@ -1,14 +1,14 @@ import { Checkbox, Dropdown, IDropdownOption, Link, Stack, Text, TextField } from "@fluentui/react"; +import * as Constants from "Common/Constants"; +import { getErrorMessage, getErrorStack } from "Common/ErrorHandlingUtils"; +import { InfoTooltip } from "Common/Tooltip/InfoTooltip"; +import { useSidePanel } from "hooks/useSidePanel"; import React, { FunctionComponent, useState } from "react"; -import * as Constants from "../../../Common/Constants"; -import { getErrorMessage, getErrorStack } from "../../../Common/ErrorHandlingUtils"; -import { InfoTooltip } from "../../../Common/Tooltip/InfoTooltip"; -import { useSidePanel } from "../../../hooks/useSidePanel"; -import * as SharedConstants from "../../../Shared/Constants"; -import { Action } from "../../../Shared/Telemetry/TelemetryConstants"; -import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor"; -import { userContext } from "../../../UserContext"; -import { isServerlessAccount } from "../../../Utils/CapabilityUtils"; +import * as SharedConstants from "Shared/Constants"; +import { Action } from "Shared/Telemetry/TelemetryConstants"; +import * as TelemetryProcessor from "Shared/Telemetry/TelemetryProcessor"; +import { userContext } from "UserContext"; +import { isServerlessAccount } from "Utils/CapabilityUtils"; import { ThroughputInput } from "../../Controls/ThroughputInput/ThroughputInput"; import Explorer from "../../Explorer"; import { CassandraAPIDataClient } from "../../Tables/TableDataClient"; diff --git a/src/Explorer/Panes/DeleteCollectionConfirmationPane/DeleteCollectionConfirmationPane.tsx b/src/Explorer/Panes/DeleteCollectionConfirmationPane/DeleteCollectionConfirmationPane.tsx index 858ba3bc4..81eeb6621 100644 --- a/src/Explorer/Panes/DeleteCollectionConfirmationPane/DeleteCollectionConfirmationPane.tsx +++ b/src/Explorer/Panes/DeleteCollectionConfirmationPane/DeleteCollectionConfirmationPane.tsx @@ -1,18 +1,18 @@ import { Text, TextField } from "@fluentui/react"; +import { Areas } from "Common/Constants"; +import { deleteCollection } from "Common/dataAccess/deleteCollection"; +import DeleteFeedback from "Common/DeleteFeedback"; +import { getErrorMessage, getErrorStack } from "Common/ErrorHandlingUtils"; +import { Collection } from "Contracts/ViewModels"; +import { useSidePanel } from "hooks/useSidePanel"; +import { useTabs } from "hooks/useTabs"; import React, { FunctionComponent, useState } from "react"; -import { Areas } from "../../../Common/Constants"; -import { deleteCollection } from "../../../Common/dataAccess/deleteCollection"; -import DeleteFeedback from "../../../Common/DeleteFeedback"; -import { getErrorMessage, getErrorStack } from "../../../Common/ErrorHandlingUtils"; -import { Collection } from "../../../Contracts/ViewModels"; -import { useSidePanel } from "../../../hooks/useSidePanel"; -import { useTabs } from "../../../hooks/useTabs"; -import { DefaultExperienceUtility } from "../../../Shared/DefaultExperienceUtility"; -import { Action, ActionModifiers } from "../../../Shared/Telemetry/TelemetryConstants"; -import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor"; -import { userContext } from "../../../UserContext"; -import { getCollectionName } from "../../../Utils/APITypeUtils"; -import * as NotificationConsoleUtils from "../../../Utils/NotificationConsoleUtils"; +import { DefaultExperienceUtility } from "Shared/DefaultExperienceUtility"; +import { Action, ActionModifiers } from "Shared/Telemetry/TelemetryConstants"; +import * as TelemetryProcessor from "Shared/Telemetry/TelemetryProcessor"; +import { userContext } from "UserContext"; +import { getCollectionName } from "Utils/APITypeUtils"; +import * as NotificationConsoleUtils from "Utils/NotificationConsoleUtils"; import { useDatabases } from "../../useDatabases"; import { useSelectedNode } from "../../useSelectedNode"; import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm"; diff --git a/src/Explorer/Panes/DeleteDatabaseConfirmationPanel.tsx b/src/Explorer/Panes/DeleteDatabaseConfirmationPanel.tsx index 24fbb1cf5..88eb8d064 100644 --- a/src/Explorer/Panes/DeleteDatabaseConfirmationPanel.tsx +++ b/src/Explorer/Panes/DeleteDatabaseConfirmationPanel.tsx @@ -1,18 +1,18 @@ import { Text, TextField } from "@fluentui/react"; import { useBoolean } from "@fluentui/react-hooks"; +import { Areas } from "Common/Constants"; +import { deleteDatabase } from "Common/dataAccess/deleteDatabase"; +import DeleteFeedback from "Common/DeleteFeedback"; +import { getErrorMessage, getErrorStack } from "Common/ErrorHandlingUtils"; +import { Collection, Database } from "Contracts/ViewModels"; +import { useSidePanel } from "hooks/useSidePanel"; +import { useTabs } from "hooks/useTabs"; import React, { FunctionComponent, useState } from "react"; -import { Areas } from "../../Common/Constants"; -import { deleteDatabase } from "../../Common/dataAccess/deleteDatabase"; -import DeleteFeedback from "../../Common/DeleteFeedback"; -import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils"; -import { Collection, Database } from "../../Contracts/ViewModels"; -import { useSidePanel } from "../../hooks/useSidePanel"; -import { useTabs } from "../../hooks/useTabs"; -import { DefaultExperienceUtility } from "../../Shared/DefaultExperienceUtility"; -import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants"; -import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor"; -import { userContext } from "../../UserContext"; -import { logConsoleError } from "../../Utils/NotificationConsoleUtils"; +import { DefaultExperienceUtility } from "Shared/DefaultExperienceUtility"; +import { Action, ActionModifiers } from "Shared/Telemetry/TelemetryConstants"; +import * as TelemetryProcessor from "Shared/Telemetry/TelemetryProcessor"; +import { userContext } from "UserContext"; +import { logConsoleError } from "Utils/NotificationConsoleUtils"; import { useDatabases } from "../useDatabases"; import { useSelectedNode } from "../useSelectedNode"; import { PanelInfoErrorComponent, PanelInfoErrorProps } from "./PanelInfoErrorComponent"; diff --git a/src/Explorer/Panes/SettingsPane/SettingsPane.tsx b/src/Explorer/Panes/SettingsPane/SettingsPane.tsx index db0746276..92d432f34 100644 --- a/src/Explorer/Panes/SettingsPane/SettingsPane.tsx +++ b/src/Explorer/Panes/SettingsPane/SettingsPane.tsx @@ -1,13 +1,13 @@ import { Checkbox, ChoiceGroup, IChoiceGroupOption, SpinButton } from "@fluentui/react"; +import * as Constants from "Common/Constants"; +import { InfoTooltip } from "Common/Tooltip/InfoTooltip"; +import { configContext } from "ConfigContext"; +import { useSidePanel } from "hooks/useSidePanel"; import React, { FunctionComponent, MouseEvent, useState } from "react"; -import * as Constants from "../../../Common/Constants"; -import { InfoTooltip } from "../../../Common/Tooltip/InfoTooltip"; -import { configContext } from "../../../ConfigContext"; -import { useSidePanel } from "../../../hooks/useSidePanel"; -import { LocalStorageUtility, StorageKey } from "../../../Shared/StorageUtility"; -import * as StringUtility from "../../../Shared/StringUtility"; -import { userContext } from "../../../UserContext"; -import { logConsoleInfo } from "../../../Utils/NotificationConsoleUtils"; +import { LocalStorageUtility, StorageKey } from "Shared/StorageUtility"; +import * as StringUtility from "Shared/StringUtility"; +import { userContext } from "UserContext"; +import { logConsoleInfo } from "Utils/NotificationConsoleUtils"; import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm"; export const SettingsPane: FunctionComponent = () => { diff --git a/src/Explorer/Panes/StringInputPane/StringInputPane.tsx b/src/Explorer/Panes/StringInputPane/StringInputPane.tsx index 8c8ce3b9e..eb9df4ad3 100644 --- a/src/Explorer/Panes/StringInputPane/StringInputPane.tsx +++ b/src/Explorer/Panes/StringInputPane/StringInputPane.tsx @@ -1,8 +1,8 @@ import { TextField } from "@fluentui/react"; +import * as ViewModels from "Contracts/ViewModels"; +import { useTabs } from "hooks/useTabs"; import React, { FormEvent, FunctionComponent, useState } from "react"; -import * as ViewModels from "../../../Contracts/ViewModels"; -import { useTabs } from "../../../hooks/useTabs"; -import { logConsoleError, logConsoleInfo, logConsoleProgress } from "../../../Utils/NotificationConsoleUtils"; +import { logConsoleError, logConsoleInfo, logConsoleProgress } from "Utils/NotificationConsoleUtils"; import * as FileSystemUtil from "../../Notebook/FileSystemUtil"; import { NotebookContentItem } from "../../Notebook/NotebookContentItem"; import NotebookV2Tab from "../../Tabs/NotebookV2Tab"; diff --git a/src/Explorer/Panes/UploadFilePane/UploadFilePane.tsx b/src/Explorer/Panes/UploadFilePane/UploadFilePane.tsx index 7a5296adb..d60ee4b27 100644 --- a/src/Explorer/Panes/UploadFilePane/UploadFilePane.tsx +++ b/src/Explorer/Panes/UploadFilePane/UploadFilePane.tsx @@ -1,7 +1,7 @@ +import { Upload } from "Common/Upload/Upload"; +import { useSidePanel } from "hooks/useSidePanel"; import React, { ChangeEvent, FunctionComponent, useState } from "react"; -import { Upload } from "../../../Common/Upload/Upload"; -import { useSidePanel } from "../../../hooks/useSidePanel"; -import { logConsoleError, logConsoleInfo, logConsoleProgress } from "../../../Utils/NotificationConsoleUtils"; +import { logConsoleError, logConsoleInfo, logConsoleProgress } from "Utils/NotificationConsoleUtils"; import { NotebookContentItem } from "../../Notebook/NotebookContentItem"; import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm"; diff --git a/src/Explorer/Panes/UploadItemsPane/UploadItemsPane.tsx b/src/Explorer/Panes/UploadItemsPane/UploadItemsPane.tsx index 62c8f67cf..388b8d944 100644 --- a/src/Explorer/Panes/UploadItemsPane/UploadItemsPane.tsx +++ b/src/Explorer/Panes/UploadItemsPane/UploadItemsPane.tsx @@ -1,8 +1,8 @@ import { DetailsList, DetailsListLayoutMode, IColumn, SelectionMode } from "@fluentui/react"; +import { Upload } from "Common/Upload/Upload"; +import { UploadDetailsRecord } from "Contracts/ViewModels"; import React, { ChangeEvent, FunctionComponent, useState } from "react"; -import { Upload } from "../../../Common/Upload/Upload"; -import { UploadDetailsRecord } from "../../../Contracts/ViewModels"; -import { logConsoleError } from "../../../Utils/NotificationConsoleUtils"; +import { logConsoleError } from "Utils/NotificationConsoleUtils"; import { getErrorMessage } from "../../Tables/Utilities"; import { useSelectedNode } from "../../useSelectedNode"; import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm"; diff --git a/tsconfig.json b/tsconfig.json index 45097fb68..39dad0788 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,18 +15,13 @@ "target": "es2017", "experimentalDecorators": true, "emitDecoratorMetadata": true, - "lib": [ - "es5", - "es6", - "dom" - ], + "lib": ["es5", "es6", "dom"], "jsx": "react", "moduleResolution": "node", "resolveJsonModule": true, "noEmit": true, - "types": [ - "jest" - ] + "types": ["jest"], + "baseUrl": "src" }, "typedocOptions": { "entryPoints": [ @@ -42,11 +37,6 @@ "includes": "./src/SelfServe/Documentation", "disableSources": true }, - "include": [ - "./src/**/*", - "./utils/**/*" - ], - "exclude": [ - "./src/**/__mocks__/**/*" - ] -} \ No newline at end of file + "include": ["src", "./src/**/*", "./utils/**/*"], + "exclude": ["./src/**/__mocks__/**/*"] +} diff --git a/webpack.config.js b/webpack.config.js index e6bcbe1e0..de87af5a2 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -227,6 +227,7 @@ module.exports = function (_env = {}, argv = {}) { rules, }, resolve: { + modules: [path.resolve(__dirname, "src"), "node_modules"], alias: { process: "process/browser", },