diff --git a/src/Explorer/Panes/Tables/AddTableEntityPanel.tsx b/src/Explorer/Panes/Tables/AddTableEntityPanel.tsx index 402e87da6..2eddcbab7 100644 --- a/src/Explorer/Panes/Tables/AddTableEntityPanel.tsx +++ b/src/Explorer/Panes/Tables/AddTableEntityPanel.tsx @@ -14,7 +14,7 @@ import * as Entities from "../../Tables/Entities"; import { CassandraAPIDataClient, CassandraTableKey, TableDataClient } from "../../Tables/TableDataClient"; import * as TableEntityProcessor from "../../Tables/TableEntityProcessor"; import * as Utilities from "../../Tables/Utilities"; -import QueryTablesTab from "../../Tabs/QueryTablesTab"; +import { NewQueryTablesTab } from "../../Tabs/QueryTablesTab/NewQueryTablesTab"; import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm"; import { attributeNameLabel, @@ -36,7 +36,7 @@ import { interface AddTableEntityPanelProps { tableDataClient: TableDataClient; - queryTablesTab: QueryTablesTab; + queryTablesTab: NewQueryTablesTab; tableEntityListViewModel: TableEntityListViewModel; cassandraApiClient: CassandraAPIDataClient; } diff --git a/src/Explorer/Panes/Tables/EditTableEntityPanel.tsx b/src/Explorer/Panes/Tables/EditTableEntityPanel.tsx index f71a1a829..9ee86448a 100644 --- a/src/Explorer/Panes/Tables/EditTableEntityPanel.tsx +++ b/src/Explorer/Panes/Tables/EditTableEntityPanel.tsx @@ -13,7 +13,7 @@ import TableEntityListViewModel from "../../Tables/DataTable/TableEntityListView import * as Entities from "../../Tables/Entities"; import { CassandraAPIDataClient, TableDataClient } from "../../Tables/TableDataClient"; import * as TableEntityProcessor from "../../Tables/TableEntityProcessor"; -import QueryTablesTab from "../../Tabs/QueryTablesTab"; +import { NewQueryTablesTab } from "../../Tabs/QueryTablesTab/NewQueryTablesTab"; import { PanelContainerComponent } from "../PanelContainerComponent"; import { attributeNameLabel, @@ -35,7 +35,7 @@ import { interface EditTableEntityPanelProps { tableDataClient: TableDataClient; - queryTablesTab: QueryTablesTab; + queryTablesTab: NewQueryTablesTab; tableEntityListViewModel: TableEntityListViewModel; cassandraApiClient: CassandraAPIDataClient; } diff --git a/src/Explorer/Tables/DataTable/DataTableViewModel.ts b/src/Explorer/Tables/DataTable/DataTableViewModel.ts index 4afcbff29..6434d6e74 100644 --- a/src/Explorer/Tables/DataTable/DataTableViewModel.ts +++ b/src/Explorer/Tables/DataTable/DataTableViewModel.ts @@ -1,14 +1,14 @@ +import { ItemDefinition, QueryIterator, Resource } from "@azure/cosmos"; import * as ko from "knockout"; import * as _ from "underscore"; - -import { Action } from "../../../Shared/Telemetry/TelemetryConstants"; -import CacheBase from "./CacheBase"; import * as CommonConstants from "../../../Common/Constants"; +import { Action } from "../../../Shared/Telemetry/TelemetryConstants"; +import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor"; +import { NewQueryTablesTab } from "../../Tabs/QueryTablesTab/NewQueryTablesTab"; import * as Constants from "../Constants"; import * as Entities from "../Entities"; -import QueryTablesTab from "../../Tabs/QueryTablesTab"; -import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor"; -import { QueryIterator, ItemDefinition, Resource } from "@azure/cosmos"; +import CacheBase from "./CacheBase"; + // This is the format of the data we will have to pass to Datatable render callback, // and property names are defined by Datatable as well. @@ -49,7 +49,7 @@ abstract class DataTableViewModel { private dataTableOperationManager: IDataTableOperation; - public queryTablesTab: QueryTablesTab; + public queryTablesTab: NewQueryTablesTab; constructor() { this.items([]); diff --git a/src/Explorer/Tables/DataTable/TableEntityListViewModel.ts b/src/Explorer/Tables/DataTable/TableEntityListViewModel.ts index f11730b2b..aef66a913 100644 --- a/src/Explorer/Tables/DataTable/TableEntityListViewModel.ts +++ b/src/Explorer/Tables/DataTable/TableEntityListViewModel.ts @@ -7,6 +7,7 @@ import { Action } from "../../../Shared/Telemetry/TelemetryConstants"; import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor"; import { userContext } from "../../../UserContext"; import QueryTablesTab from "../../Tabs/QueryTablesTab"; +import { NewQueryTablesTab } from "../../Tabs/QueryTablesTab/NewQueryTablesTab"; import * as Constants from "../Constants"; import { getQuotedCqlIdentifier } from "../CqlUtilities"; import * as Entities from "../Entities"; @@ -112,7 +113,7 @@ export default class TableEntityListViewModel extends DataTableViewModel { public queryErrorMessage: ko.Observable; public id: string; - constructor(tableCommands: TableCommands, queryTablesTab: QueryTablesTab) { + constructor(tableCommands: TableCommands, queryTablesTab: NewQueryTablesTab) { super(); this.cache = new TableEntityCache(); this.queryErrorMessage = ko.observable(); diff --git a/src/Explorer/Tables/QueryBuilder/QueryViewModel.tsx b/src/Explorer/Tables/QueryBuilder/QueryViewModel.tsx index f816cad60..271612086 100644 --- a/src/Explorer/Tables/QueryBuilder/QueryViewModel.tsx +++ b/src/Explorer/Tables/QueryBuilder/QueryViewModel.tsx @@ -5,7 +5,7 @@ import { KeyCodes } from "../../../Common/Constants"; import { useSidePanel } from "../../../hooks/useSidePanel"; import { userContext } from "../../../UserContext"; import { TableQuerySelectPanel } from "../../Panes/Tables/TableQuerySelectPanel/TableQuerySelectPanel"; -import QueryTablesTab from "../../Tabs/QueryTablesTab"; +import { NewQueryTablesTab } from "../../Tabs/QueryTablesTab/NewQueryTablesTab"; import { getQuotedCqlIdentifier } from "../CqlUtilities"; import * as DataTableUtilities from "../DataTable/DataTableUtilities"; import TableEntityListViewModel from "../DataTable/TableEntityListViewModel"; @@ -39,14 +39,14 @@ export default class QueryViewModel { public columnOptions: ko.ObservableArray; - public queryTablesTab: QueryTablesTab; + public queryTablesTab: NewQueryTablesTab; public id: string; private _tableEntityListViewModel: TableEntityListViewModel; - constructor(queryTablesTab: QueryTablesTab) { + constructor(queryTablesTab: NewQueryTablesTab) { this.queryTablesTab = queryTablesTab; this.id = `queryViewModel${this.queryTablesTab.tabId}`; - this._tableEntityListViewModel = queryTablesTab.tableEntityListViewModel(); + this._tableEntityListViewModel = queryTablesTab.tableEntityListViewModel; this.queryTextIsReadOnly = ko.computed(() => { return userContext.apiType !== "Cassandra"; diff --git a/src/Explorer/Tabs/QueryTablesTab/NewQueryTablesTab.tsx b/src/Explorer/Tabs/QueryTablesTab/NewQueryTablesTab.tsx new file mode 100644 index 000000000..c69ac54d8 --- /dev/null +++ b/src/Explorer/Tabs/QueryTablesTab/NewQueryTablesTab.tsx @@ -0,0 +1,52 @@ +import React from "react"; +import * as DataModels from "../../../Contracts/DataModels"; +import type { TabOptions } from "../../../Contracts/ViewModels"; +import { useTabs } from "../../../hooks/useTabs"; +import Explorer from "../../Explorer"; +import TableCommands from "../../Tables/DataTable/TableCommands"; +import TableEntityListViewModel from "../../Tables/DataTable/TableEntityListViewModel"; +import TabsBase from "../TabsBase"; +import { + IQueryTablesTabAccessor, + IQueryTablesTabComponentProps, + QueryTablesTabComponent, +} from "./QueryTablesTabComponent"; + +export interface IQueryTablesTabProps { + container: Explorer; +} + +export class NewQueryTablesTab extends TabsBase { + public queryText: string; + public currentQuery: string; + public partitionKey: DataModels.PartitionKey; + public iQueryTablesTabComponentProps: IQueryTablesTabComponentProps; + public tableEntityListViewModel: TableEntityListViewModel; + public tableCommands: TableCommands; + public iQueryTablesTabAccessor: IQueryTablesTabAccessor; + + constructor(options: TabOptions, private props: IQueryTablesTabProps) { + super(options); + this.tableCommands = new TableCommands(props.container); + this.tableEntityListViewModel = new TableEntityListViewModel(this.tableCommands, this); + this.iQueryTablesTabComponentProps = { + collection: this.collection, + tabId: this.tabId, + tabsBaseInstance: this, + queryTablesTab: this, + container: this.props.container, + onQueryTablesTabAccessor: (instance: IQueryTablesTabAccessor) => { + this.iQueryTablesTabAccessor = instance; + }, + }; + } + + public render(): JSX.Element { + return ; + } + + public onTabClick(): void { + useTabs.getState().activateTab(this); + this.iQueryTablesTabAccessor.onTabClickEvent(); + } +} diff --git a/src/Explorer/Tabs/QueryTablesTab/QueryTablesTab.tsx b/src/Explorer/Tabs/QueryTablesTab/QueryTablesTab.tsx deleted file mode 100644 index e55be520a..000000000 --- a/src/Explorer/Tabs/QueryTablesTab/QueryTablesTab.tsx +++ /dev/null @@ -1,558 +0,0 @@ -import * as ko from "knockout"; -import Q from "q"; -import React, { useState } from 'react'; -import AddEntityIcon from "../../../../images/AddEntity.svg"; -import DeleteEntitiesIcon from "../../../../images/DeleteEntities.svg"; -import EditEntityIcon from "../../../../images/Edit-entity.svg"; -import ExecuteQueryIcon from "../../../../images/ExecuteQuery.svg"; -import QueryBuilderIcon from "../../../../images/Query-Builder.svg"; -import QueryTextIcon from "../../../../images/Query-Text.svg"; -import * as ViewModels from "../../../Contracts/ViewModels"; -import { userContext } from "../../../UserContext"; -import { CommandButtonComponentProps } from "../../Controls/CommandButton/CommandButtonComponent"; -import Explorer from "../../Explorer"; -import TableCommands from "../../Tables/DataTable/TableCommands"; -import TableEntityListViewModel from "../../Tables/DataTable/TableEntityListViewModel"; -import QueryViewModel from "../../Tables/QueryBuilder/QueryViewModel"; -import { TableDataClient } from "../../Tables/TableDataClient"; -import template from "../QueryTablesTab.html"; - -export default () => { - const html = template; - let collection: ViewModels.Collection; - let tableEntityListViewModel : TableEntityListViewModel; - let queryViewModel :QueryViewModel; - let tableCommands: TableCommands; - let tableDataClient: TableDataClient; - const [queryText, setQueryText] = useState("PartitionKey eq 'partitionKey1'"); - let selectedQueryText = ko.observable("").extend({ notify: "always" }); - - let executeQueryButton: ViewModels.Button; - let addEntityButton: ViewModels.Button; - let editEntityButton: ViewModels.Button; - let deleteEntityButton: ViewModels.Button; - let queryBuilderButton: ViewModels.Button; - let queryTextButton: ViewModels.Button; - let container: Explorer; - - constructor(options: ViewModels.TabOptions) { - super(options); - - this.container = options.collection && options.collection.container; - this.tableCommands = new TableCommands(this.container); - this.tableDataClient = this.container.tableDataClient; - this.tableEntityListViewModel(new TableEntityListViewModel(this.tableCommands, this)); - this.tableEntityListViewModel().queryTablesTab = this; - this.queryViewModel(new QueryViewModel(this)); - const sampleQuerySubscription = this.tableEntityListViewModel().items.subscribe(() => { - if (this.tableEntityListViewModel().items().length > 0 && userContext.apiType === "Tables") { - this.queryViewModel().queryBuilderViewModel().setExample(); - } - sampleQuerySubscription.dispose(); - }); - - this.executeQueryButton = { - enabled: ko.computed(() => { - return true; - }), - - visible: ko.computed(() => { - return true; - }), - }; - - this.queryBuilderButton = { - enabled: ko.computed(() => { - return true; - }), - - visible: ko.computed(() => { - return true; - }), - - isSelected: ko.computed(() => { - return this.queryViewModel() ? this.queryViewModel().isHelperActive() : false; - }), - }; - - this.queryTextButton = { - enabled: ko.computed(() => { - return true; - }), - - visible: ko.computed(() => { - return true; - }), - - isSelected: ko.computed(() => { - return this.queryViewModel() ? this.queryViewModel().isEditorActive() : false; - }), - }; - - this.addEntityButton = { - enabled: ko.computed(() => { - return true; - }), - - visible: ko.computed(() => { - return true; - }), - }; - - this.editEntityButton = { - enabled: ko.computed(() => { - return this.tableCommands.isEnabled( - TableCommands.editEntityCommand, - this.tableEntityListViewModel().selected() - ); - }), - - visible: ko.computed(() => { - return true; - }), - }; - - this.deleteEntityButton = { - enabled: ko.computed(() => { - return this.tableCommands.isEnabled( - TableCommands.deleteEntitiesCommand, - this.tableEntityListViewModel().selected() - ); - }), - - visible: ko.computed(() => { - return true; - }), - }; - - this.buildCommandBarOptions(); - } - - const onExecuteQueryClick = (): Q.Promise => { - this.queryViewModel().runQuery(); - return null; - }; - - const onQueryBuilderClick = (): Q.Promise => { - this.queryViewModel().selectHelper(); - return null; - }; - - const onQueryTextClick = (): Q.Promise => { - this.queryViewModel().selectEditor(); - return null; - }; - - const onAddEntityClick = (): Q.Promise => { - this.container.openAddTableEntityPanel(this, this.tableEntityListViewModel()); - return null; - }; - - const onEditEntityClick = (): Q.Promise => { - this.container.openEditTableEntityPanel(this, this.tableEntityListViewModel()); - return null; - }; - - const onDeleteEntityClick = (): Q.Promise => { - this.tableCommands.deleteEntitiesCommand(this.tableEntityListViewModel()); - return null; - }; - - const onActivate(): void { - super.onActivate(); - const columns = - !!this.tableEntityListViewModel() && - !!this.tableEntityListViewModel().table && - this.tableEntityListViewModel().table.columns; - if (!!columns) { - columns.adjust(); - $(window).resize(); - } - } - - protected getTabsButtons(): CommandButtonComponentProps[] { - const buttons: CommandButtonComponentProps[] = []; - if (this.queryBuilderButton.visible()) { - const label = userContext.apiType === "Cassandra" ? "CQL Query Builder" : "Query Builder"; - buttons.push({ - iconSrc: QueryBuilderIcon, - iconAlt: label, - onCommandClick: this.onQueryBuilderClick, - commandButtonLabel: label, - ariaLabel: label, - hasPopup: false, - disabled: !this.queryBuilderButton.enabled(), - isSelected: this.queryBuilderButton.isSelected(), - }); - } - - if (this.queryTextButton.visible()) { - const label = userContext.apiType === "Cassandra" ? "CQL Query Text" : "Query Text"; - buttons.push({ - iconSrc: QueryTextIcon, - iconAlt: label, - onCommandClick: this.onQueryTextClick, - commandButtonLabel: label, - ariaLabel: label, - hasPopup: false, - disabled: !this.queryTextButton.enabled(), - isSelected: this.queryTextButton.isSelected(), - }); - } - - if (this.executeQueryButton.visible()) { - const label = "Run Query"; - buttons.push({ - iconSrc: ExecuteQueryIcon, - iconAlt: label, - onCommandClick: this.onExecuteQueryClick, - commandButtonLabel: label, - ariaLabel: label, - hasPopup: false, - disabled: !this.executeQueryButton.enabled(), - }); - } - - if (this.addEntityButton.visible()) { - const label = userContext.apiType === "Cassandra" ? "Add Row" : "Add Entity"; - buttons.push({ - iconSrc: AddEntityIcon, - iconAlt: label, - onCommandClick: this.onAddEntityClick, - commandButtonLabel: label, - ariaLabel: label, - hasPopup: true, - disabled: !this.addEntityButton.enabled(), - }); - } - - if (this.editEntityButton.visible()) { - const label = userContext.apiType === "Cassandra" ? "Edit Row" : "Edit Entity"; - buttons.push({ - iconSrc: EditEntityIcon, - iconAlt: label, - onCommandClick: this.onEditEntityClick, - commandButtonLabel: label, - ariaLabel: label, - hasPopup: true, - disabled: !this.editEntityButton.enabled(), - }); - } - - if (this.deleteEntityButton.visible()) { - const label = userContext.apiType === "Cassandra" ? "Delete Rows" : "Delete Entities"; - buttons.push({ - iconSrc: DeleteEntitiesIcon, - iconAlt: label, - onCommandClick: this.onDeleteEntityClick, - commandButtonLabel: label, - ariaLabel: label, - hasPopup: true, - disabled: !this.deleteEntityButton.enabled(), - }); - } - return buttons; - } - - protected buildCommandBarOptions(): void { - ko.computed(() => - ko.toJSON([ - this.queryBuilderButton.visible, - this.queryBuilderButton.enabled, - this.queryTextButton.visible, - this.queryTextButton.enabled, - this.executeQueryButton.visible, - this.executeQueryButton.enabled, - this.addEntityButton.visible, - this.addEntityButton.enabled, - this.editEntityButton.visible, - this.editEntityButton.enabled, - this.deleteEntityButton.visible, - this.deleteEntityButton.enabled, - ]) - ).subscribe(() => this.updateNavbarWithTabsButtons()); - this.updateNavbarWithTabsButtons(); - } - - return ( -
- -
-
- { - hasQueryError &&
- - {queryErrorMessage} -
- }
- - {isEditorActive &&
-
- -
-
- } - {isHelperActive &&
-
-
- - - - - - - - - - - - - - - {clauseArray.map((clause, index)=> - - - - - - - - - -) } - - -
- {actionLabel} - - {canGroupClauses && - - {andLabel} - - {fieldLabel} - - {dataTypeLabel} - - {operatorLabel} - - {valueLabel} -
- - Add clause - - - Delete clause - - - - - - - - {$parent.getClauseGroupViewModels($data).map((gi, index)=> - - -) - - - -
- {gi.canUngroup && } - } - - -
-
- {canAnd && - } - - - {isTypeEditable && } - - {isValue && - - } - - {isTimestamp && - - } - - {isCustomLastTimestamp - && - - } - { isCustomRangeTimestamp && - - } -
-
-
-
- - Add new clause - {addNewClauseLine} - -
-
-
-
- }
-
- -
- toggle -
-
- toggle -
- Advanced Options -
-
- {isExpanded &&
-
- Show top results: - - {isExceedingLimit &&
- - {topValueLimitMessage} -
- - }
-
- Select fields for query: - {isSelected &&
- - {selectMessage} -
- } - Choose Columns... - -
-
- }
-
-
-
-
-
- ); -} diff --git a/src/Explorer/Tabs/QueryTablesTab/QueryTablesTabComponent.tsx b/src/Explorer/Tabs/QueryTablesTab/QueryTablesTabComponent.tsx new file mode 100644 index 000000000..155106fda --- /dev/null +++ b/src/Explorer/Tabs/QueryTablesTab/QueryTablesTabComponent.tsx @@ -0,0 +1,619 @@ +import React from "react"; +import AddEntityIcon from "../../../../images/AddEntity.svg"; +import DeleteEntitiesIcon from "../../../../images/DeleteEntities.svg"; +import EditEntityIcon from "../../../../images/Edit-entity.svg"; +import ExecuteQueryIcon from "../../../../images/ExecuteQuery.svg"; +import QueryBuilderIcon from "../../../../images/Query-Builder.svg"; +import QueryTextIcon from "../../../../images/Query-Text.svg"; +import * as ViewModels from "../../../Contracts/ViewModels"; +import { useSidePanel } from "../../../hooks/useSidePanel"; +import { userContext } from "../../../UserContext"; +import { CommandButtonComponentProps } from "../../Controls/CommandButton/CommandButtonComponent"; +import Explorer from "../../Explorer"; +import { AddTableEntityPanel } from "../../Panes/Tables/AddTableEntityPanel"; +import { EditTableEntityPanel } from "../../Panes/Tables/EditTableEntityPanel"; +import TableCommands from "../../Tables/DataTable/TableCommands"; +import TableEntityListViewModel from "../../Tables/DataTable/TableEntityListViewModel"; +import QueryViewModel from "../../Tables/QueryBuilder/QueryViewModel"; +import { CassandraAPIDataClient, TableDataClient } from "../../Tables/TableDataClient"; +import TabsBase from "../TabsBase"; +import { NewQueryTablesTab } from "./NewQueryTablesTab"; + +export interface IQueryTablesTabAccessor { + onTabClickEvent: () => void; +} + +export interface Button { + visible: boolean; + enabled: boolean; + isSelected?: boolean; +} + +export interface IQueryTablesTabComponentStates { + queryViewModel: QueryViewModel; + queryText: string; + selectedQueryText: string; + executeQueryButton: Button; + queryBuilderButton: Button; + queryTextButton: Button; + addEntityButton: Button; + editEntityButton: Button; + deleteEntityButton: Button; +} + +export interface IQueryTablesTabComponentProps { + collection: ViewModels.CollectionBase; + tabsBaseInstance: TabsBase; + tabId: string; + queryTablesTab: NewQueryTablesTab; + container: Explorer; + onQueryTablesTabAccessor: (instance: IQueryTablesTabAccessor) => void; +} + +export class QueryTablesTabComponent extends React.Component< + IQueryTablesTabComponentProps, + IQueryTablesTabComponentStates +> { + public collection: ViewModels.Collection; + public tableEntityListViewModel: TableEntityListViewModel; + public tableCommands: TableCommands; + public tableDataClient: TableDataClient; + public container: Explorer; + public queryViewModel: QueryViewModel; + + constructor(props: IQueryTablesTabComponentProps) { + super(props); + this.container = props.collection && props.collection.container; + this.tableCommands = new TableCommands(this.container); + this.tableDataClient = this.container.tableDataClient; + this.tableEntityListViewModel = new TableEntityListViewModel(this.tableCommands, props.queryTablesTab); + this.tableEntityListViewModel.queryTablesTab = props.queryTablesTab; + this.queryViewModel = new QueryViewModel(props.queryTablesTab); + this.state = { + queryViewModel: this.queryViewModel, + queryText: "PartitionKey eq 'partitionKey1'", + selectedQueryText: "", + executeQueryButton: { + enabled: true, + visible: true, + }, + queryBuilderButton: { + enabled: true, + visible: true, + isSelected: this.queryViewModel ? this.queryViewModel.isHelperActive() : false, + }, + queryTextButton: { + enabled: true, + visible: true, + isSelected: this.queryViewModel ? this.queryViewModel.isEditorActive() : false, + }, + addEntityButton: { + enabled: true, + visible: true, + }, + editEntityButton: { + enabled: this.tableCommands.isEnabled( + TableCommands.editEntityCommand, + this.tableEntityListViewModel.selected() + ), + visible: true, + }, + deleteEntityButton: { + enabled: this.tableCommands.isEnabled( + TableCommands.deleteEntitiesCommand, + this.tableEntityListViewModel.selected() + ), + visible: true, + }, + }; + if (this.tableEntityListViewModel.items().length > 0 && userContext.apiType === "Tables") { + const sampleQuerySubscription = this.state.queryViewModel.queryBuilderViewModel().setExample(); + } + } + public onExecuteQueryClick(): void { + this.state.queryViewModel.runQuery(); + } + + public onQueryBuilderClick(): void { + this.state.queryViewModel.selectHelper(); + } + + public onQueryTextClick(): void { + this.state.queryViewModel.selectEditor(); + } + + public onAddEntityClick(): void { + useSidePanel + .getState() + .openSidePanel( + "Add Table Row", + , + "700px" + ); + } + + public onEditEntityClick(): void { + useSidePanel + .getState() + .openSidePanel( + "Edit Table Entity", + + ); + } + + public onDeleteEntityClick(): void { + this.tableCommands.deleteEntitiesCommand(this.tableEntityListViewModel); + } + + public onActivate(): void { + const columns = + !!this.tableEntityListViewModel && + !!this.tableEntityListViewModel.table && + this.tableEntityListViewModel.table.columns; + if (!!columns) { + columns.adjust(); + $(window).resize(); + } + } + + public getTabsButtons(): CommandButtonComponentProps[] { + const buttons: CommandButtonComponentProps[] = []; + if (this.state.queryBuilderButton.visible) { + const label = userContext.apiType === "Cassandra" ? "CQL Query Builder" : "Query Builder"; + buttons.push({ + iconSrc: QueryBuilderIcon, + iconAlt: label, + onCommandClick: this.onQueryBuilderClick, + commandButtonLabel: label, + ariaLabel: label, + hasPopup: false, + disabled: !this.state.queryBuilderButton.enabled, + isSelected: this.state.queryBuilderButton.isSelected, + }); + } + + if (this.state.queryTextButton.visible) { + const label = userContext.apiType === "Cassandra" ? "CQL Query Text" : "Query Text"; + buttons.push({ + iconSrc: QueryTextIcon, + iconAlt: label, + onCommandClick: this.onQueryTextClick, + commandButtonLabel: label, + ariaLabel: label, + hasPopup: false, + disabled: !this.state.queryTextButton.enabled, + isSelected: this.state.queryTextButton.isSelected, + }); + } + + if (this.state.executeQueryButton.visible) { + const label = "Run Query"; + buttons.push({ + iconSrc: ExecuteQueryIcon, + iconAlt: label, + onCommandClick: this.onExecuteQueryClick, + commandButtonLabel: label, + ariaLabel: label, + hasPopup: false, + disabled: !this.state.executeQueryButton.enabled, + }); + } + + if (this.state.addEntityButton.visible) { + const label = userContext.apiType === "Cassandra" ? "Add Row" : "Add Entity"; + buttons.push({ + iconSrc: AddEntityIcon, + iconAlt: label, + onCommandClick: this.onAddEntityClick, + commandButtonLabel: label, + ariaLabel: label, + hasPopup: true, + disabled: !this.state.addEntityButton.enabled, + }); + } + + if (this.state.editEntityButton.visible) { + const label = userContext.apiType === "Cassandra" ? "Edit Row" : "Edit Entity"; + buttons.push({ + iconSrc: EditEntityIcon, + iconAlt: label, + onCommandClick: this.onEditEntityClick, + commandButtonLabel: label, + ariaLabel: label, + hasPopup: true, + disabled: !this.state.editEntityButton.enabled, + }); + } + + if (this.state.deleteEntityButton.visible) { + const label = userContext.apiType === "Cassandra" ? "Delete Rows" : "Delete Entities"; + buttons.push({ + iconSrc: DeleteEntitiesIcon, + iconAlt: label, + onCommandClick: this.onDeleteEntityClick, + commandButtonLabel: label, + ariaLabel: label, + hasPopup: true, + disabled: !this.state.deleteEntityButton.enabled, + }); + } + return buttons; + } + + public render(): JSX.Element { + const { tabId } = this.props; + const { queryViewModel, queryText } = this.state; + const { + isEditorActive, + isHelperActive, + hasQueryError, + queryErrorMessage, + queryBuilderViewModel, + toggleAdvancedOptions, + ontoggleAdvancedOptionsKeyDown, + } = queryViewModel; + const { + canGroupClauses, + andLabel, + actionLabel, + groupClauses, + groupSelectedClauses, + fieldLabel, + dataTypeLabel, + operatorLabel, + valueLabel, + clauseArray, + columnOptions, + clauseRules, + operators, + insertNewFilterLine, + onAddClauseKeyDown, + addClauseIndex, + removeThisFilterLine, + onDeleteClauseKeyDown, + deleteClause, + getClauseGroupViewModels, + updateColumnOptions, + edmTypes, + addNewClause, + addNewClauseLine, + } = queryBuilderViewModel(); + console.log("queryBuilderViewModel()", queryBuilderViewModel()); + console.log("clauseArray()", clauseArray()); + console.log("clauseRules()", clauseRules()); + console.log("columnOptions()", columnOptions()); + console.log("operators()", operators()); + return ( +
+
+
+ {hasQueryError && ( +
+ + + + + {queryErrorMessage} + +
+ )} +
+ + {isEditorActive() && ( +
+
+ +
+
+ )} + {isHelperActive && ( +
+
+
+ + + + + + + + + + + + + + + {clauseArray().map((data, index) => ( + + + {/* */} + {/* + + + + + + */} + + ))} + +
+ {actionLabel} + + {canGroupClauses && ( + + )} + + {andLabel} + + {fieldLabel} + + {dataTypeLabel} + + {operatorLabel} + + {valueLabel} +
+ + Add clause + + + Delete clause + + + + + + + + {getClauseGroupViewModels(data).map((gi, index) => ( + + ))} + + +
+ {gi.canUngroup && ( + + )} +
+
+ {canAnd && ( + + )} + + + + {isTypeEditable && ( + + )} + + {isOperaterEditable && ( + + )} + + {isValue && ( + + )} + + {isTimestamp && ( + + )} + + {isCustomLastTimestamp && ( + + )} + {isCustomRangeTimestamp && ( + + )} +
+
+
+
+ + Add new clause + {addNewClauseLine} + +
+
+
+
+ )} +
+ {/*
+ +
+ toggle +
+
+ toggle +
+ Advanced Options +
+
+ {isExpanded && ( +
+
+ Show top results: + + {isExceedingLimit && ( +
+ + {topValueLimitMessage} +
+ )} +
+
+ Select fields for query: + {isSelected && ( +
+ + {selectMessage} +
+ )} + + Choose Columns... + +
+
+ )} */} +
+
+ +
+
+
+
+ ); + } +} diff --git a/src/Explorer/Tree/Collection.ts b/src/Explorer/Tree/Collection.ts index cefa6bbeb..8ad1cdc53 100644 --- a/src/Explorer/Tree/Collection.ts +++ b/src/Explorer/Tree/Collection.ts @@ -32,7 +32,7 @@ import MongoDocumentsTab from "../Tabs/MongoDocumentsTab"; import { NewMongoQueryTab } from "../Tabs/MongoQueryTab/MongoQueryTab"; import { NewMongoShellTab } from "../Tabs/MongoShellTab/MongoShellTab"; import { NewQueryTab } from "../Tabs/QueryTab/QueryTab"; -import QueryTablesTab from "../Tabs/QueryTablesTab"; +import { NewQueryTablesTab } from "../Tabs/QueryTablesTab/NewQueryTablesTab"; import { CollectionSettingsTabV2 } from "../Tabs/SettingsTabV2"; import { useDatabases } from "../useDatabases"; import { useSelectedNode } from "../useSelectedNode"; @@ -391,13 +391,13 @@ export default class Collection implements ViewModels.Collection { }); } - const queryTablesTabs: QueryTablesTab[] = useTabs + const queryTablesTabs: NewQueryTablesTab[] = useTabs .getState() .getTabs( ViewModels.CollectionTabKind.QueryTables, (tab) => tab.collection && tab.collection.databaseId === this.databaseId && tab.collection.id() === this.id() - ) as QueryTablesTab[]; - let queryTablesTab: QueryTablesTab = queryTablesTabs && queryTablesTabs[0]; + ) as NewQueryTablesTab[]; + let queryTablesTab: NewQueryTablesTab = queryTablesTabs && queryTablesTabs[0]; if (queryTablesTab) { useTabs.getState().activateTab(queryTablesTab); @@ -415,14 +415,14 @@ export default class Collection implements ViewModels.Collection { tabTitle: title, }); - queryTablesTab = new QueryTablesTab({ + queryTablesTab = new NewQueryTablesTab({ tabKind: ViewModels.CollectionTabKind.QueryTables, title: title, tabPath: "", collection: this, node: this, onLoadStartKey: startKey, - }); + }, { container: this.container }); useTabs.getState().activateNewTab(queryTablesTab); }