Compare commits

..

3 Commits

Author SHA1 Message Date
Victor Meng
d1d62d34d1 Turn on carousel to insert sample data 2023-07-11 16:27:11 -07:00
Karthik chakravarthy
cf0c51337f Change websocket authentication from url token to getting token from payload (#1487)
* Change websocket authentication from url to message body

* Add new message type

* Validation checks

* Remove flight and always send token in payload
2023-07-11 15:45:41 -04:00
victor-meng
1d6c0bbd1e Fix issue with executing queries in the query copilot tab (#1522) 2023-07-11 11:59:26 -07:00
12 changed files with 104 additions and 86 deletions

View File

@@ -13,11 +13,6 @@
font-size: 12px; font-size: 12px;
} }
.sampleCollectionHeader {
margin-left: @MediumSpace;
font-size: 12px;
}
.loadMoreHeader { .loadMoreHeader {
color: RGB(5, 99, 193); color: RGB(5, 99, 193);
} }

View File

@@ -115,7 +115,7 @@ export interface CollectionBase extends TreeNode {
isCollectionExpanded: ko.Observable<boolean>; isCollectionExpanded: ko.Observable<boolean>;
isSampleCollection?: boolean; isSampleCollection?: boolean;
onDocumentDBDocumentsClick(isQueryCopilotCollection?: boolean, sampleCollection?: CollectionBase): void; onDocumentDBDocumentsClick(): void;
onNewQueryClick(source: any, event?: MouseEvent, queryText?: string): void; onNewQueryClick(source: any, event?: MouseEvent, queryText?: string): void;
expandCollection(): void; expandCollection(): void;
collapseCollection(): void; collapseCollection(): void;

View File

@@ -35,7 +35,7 @@ export class EditorReact extends React.Component<EditorReactProps, EditorReactSt
public componentDidUpdate(previous: EditorReactProps) { public componentDidUpdate(previous: EditorReactProps) {
if (this.props.content !== previous.content) { if (this.props.content !== previous.content) {
this.editor?.setValue(this.props.content); this.editor.setValue(this.props.content);
} }
} }

View File

@@ -1,23 +1,23 @@
import { import {
actions,
AppState, AppState,
castToSessionId,
ContentRef, ContentRef,
createKernelRef,
JupyterHostRecordProps, JupyterHostRecordProps,
ServerConfig as JupyterServerConfig,
KernelInfo, KernelInfo,
KernelRef, KernelRef,
RemoteKernelProps, RemoteKernelProps,
actions,
castToSessionId,
createKernelRef,
selectors, selectors,
ServerConfig as JupyterServerConfig,
} from "@nteract/core"; } from "@nteract/core";
import { Channels, childOf, createMessage, JupyterMessage, message, ofMessageType } from "@nteract/messaging"; import { Channels, childOf, createMessage, message, ofMessageType } from "@nteract/messaging";
import { defineConfigOption } from "@nteract/mythic-configuration"; import { defineConfigOption } from "@nteract/mythic-configuration";
import { RecordOf } from "immutable"; import { RecordOf } from "immutable";
import { Action, AnyAction } from "redux"; import { Action, AnyAction } from "redux";
import { ofType, StateObservable } from "redux-observable"; import { StateObservable, ofType } from "redux-observable";
import { kernels, sessions } from "rx-jupyter"; import { kernels, sessions } from "rx-jupyter";
import { concat, EMPTY, from, interval, merge, Observable, Observer, of, Subject, Subscriber, timer } from "rxjs"; import { EMPTY, Observable, Observer, Subject, Subscriber, concat, from, interval, merge, of, timer } from "rxjs";
import { import {
catchError, catchError,
concatMap, concatMap,
@@ -35,17 +35,17 @@ import {
import { webSocket } from "rxjs/webSocket"; import { webSocket } from "rxjs/webSocket";
import * as Constants from "../../../Common/Constants"; import * as Constants from "../../../Common/Constants";
import { Areas } from "../../../Common/Constants"; import { Areas } from "../../../Common/Constants";
import { useTabs } from "../../../hooks/useTabs"; import { ActionModifiers, Action as TelemetryAction } from "../../../Shared/Telemetry/TelemetryConstants";
import { Action as TelemetryAction, ActionModifiers } from "../../../Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor"; import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor";
import { logConsoleError, logConsoleInfo } from "../../../Utils/NotificationConsoleUtils"; import { logConsoleError, logConsoleInfo } from "../../../Utils/NotificationConsoleUtils";
import { useTabs } from "../../../hooks/useTabs";
import { useDialog } from "../../Controls/Dialog"; import { useDialog } from "../../Controls/Dialog";
import * as FileSystemUtil from "../FileSystemUtil"; import * as FileSystemUtil from "../FileSystemUtil";
import * as cdbActions from "../NotebookComponent/actions"; import * as cdbActions from "../NotebookComponent/actions";
import { NotebookContentProviderType, NotebookUtil } from "../NotebookUtil"; import { NotebookContentProviderType, NotebookUtil } from "../NotebookUtil";
import * as CdbActions from "./actions"; import * as CdbActions from "./actions";
import * as TextFile from "./contents/file/text-file"; import * as TextFile from "./contents/file/text-file";
import { CdbAppState } from "./types"; import { CdbAppState, JupyterMessage } from "./types";
interface NotebookServiceConfig extends JupyterServerConfig { interface NotebookServiceConfig extends JupyterServerConfig {
userPuid?: string; userPuid?: string;
@@ -106,10 +106,8 @@ const formWebSocketURL = (serverConfig: NotebookServiceConfig, kernelId: string,
if (sessionId) { if (sessionId) {
params.append("session_id", sessionId); params.append("session_id", sessionId);
} }
const q = params.toString(); const q = params.toString();
const suffix = q !== "" ? `?${q}` : ""; const suffix = q !== "" ? `?${q}` : "";
const url = (serverConfig.endpoint.slice(0, -1) || "") + `api/kernels/${kernelId}/channels${suffix}`; const url = (serverConfig.endpoint.slice(0, -1) || "") + `api/kernels/${kernelId}/channels${suffix}`;
return url.replace(/^http(s)?/, "ws$1"); return url.replace(/^http(s)?/, "ws$1");
@@ -241,10 +239,10 @@ const connect = (serverConfig: NotebookServiceConfig, kernelID: string, sessionI
...message, ...message,
header: { header: {
session: sessionID, session: sessionID,
token: serverConfig.token,
...message.header, ...message.header,
}, },
}; };
wsSubject.next(sessionizedMessage); wsSubject.next(sessionizedMessage);
} else { } else {
console.error("Message must be an object, the app sent", message); console.error("Message must be an object, the app sent", message);

View File

@@ -1,5 +1,6 @@
import { CellId } from "@nteract/commutable"; import { CellId } from "@nteract/commutable";
import { AppState } from "@nteract/core"; import { AppState } from "@nteract/core";
import { MessageType } from "@nteract/messaging";
import * as Immutable from "immutable"; import * as Immutable from "immutable";
import { Notebook } from "../../../Common/Constants"; import { Notebook } from "../../../Common/Constants";
@@ -53,3 +54,26 @@ export const makeCdbRecord = Immutable.Record<CdbRecordProps>({
pendingSnapshotRequest: undefined, pendingSnapshotRequest: undefined,
notebookSnapshotError: undefined, notebookSnapshotError: undefined,
}); });
export interface JupyterMessage<MT extends MessageType = MessageType, C = any> {
header: JupyterMessageHeader<MT>;
parent_header:
| JupyterMessageHeader<any>
| {
msg_id?: string;
};
metadata: object;
content: C;
channel: string;
buffers?: Uint8Array | null;
}
export interface JupyterMessageHeader<MT extends MessageType = MessageType> {
msg_id: string;
username: string;
date: string;
msg_type: MT;
version: string;
session: string;
token: string;
}

View File

@@ -13,11 +13,8 @@ import {
} from "@fluentui/react"; } from "@fluentui/react";
import { QueryCopilotSampleDatabaseId, StyleConstants } from "Common/Constants"; import { QueryCopilotSampleDatabaseId, StyleConstants } from "Common/Constants";
import { handleError } from "Common/ErrorHandlingUtils"; import { handleError } from "Common/ErrorHandlingUtils";
import { createCollection } from "Common/dataAccess/createCollection";
import * as DataModels from "Contracts/DataModels";
import { ContainerSampleGenerator } from "Explorer/DataSamples/ContainerSampleGenerator"; import { ContainerSampleGenerator } from "Explorer/DataSamples/ContainerSampleGenerator";
import Explorer from "Explorer/Explorer"; import Explorer from "Explorer/Explorer";
import { AllPropertiesIndexed } from "Explorer/Panes/AddCollectionPanel";
import { PromptCard } from "Explorer/QueryCopilot/PromptCard"; import { PromptCard } from "Explorer/QueryCopilot/PromptCard";
import { useDatabases } from "Explorer/useDatabases"; import { useDatabases } from "Explorer/useDatabases";
import { useCarousel } from "hooks/useCarousel"; import { useCarousel } from "hooks/useCarousel";
@@ -78,30 +75,27 @@ export const QueryCopilotCarousel: React.FC<QueryCopilotCarouselProps> = ({
}; };
const createSampleDatabase = async (): Promise<void> => { const createSampleDatabase = async (): Promise<void> => {
const database = useDatabases.getState().findDatabaseWithId(QueryCopilotSampleDatabaseId); // const database = useDatabases.getState().findDatabaseWithId(QueryCopilotSampleDatabaseId);
if (database) {
return;
}
try { try {
setIsCreatingDatabase(true); // setIsCreatingDatabase(true);
setSpinnerText("Setting up your database..."); // setSpinnerText("Setting up your database...");
const params: DataModels.CreateCollectionParams = { // const params: DataModels.CreateCollectionParams = {
createNewDatabase: true, // createNewDatabase: false,
collectionId: "SampleContainer", // collectionId: "SampleContainer",
databaseId: QueryCopilotSampleDatabaseId, // databaseId: QueryCopilotSampleDatabaseId,
databaseLevelThroughput: true, // databaseLevelThroughput: true,
autoPilotMaxThroughput: 1000, // autoPilotMaxThroughput: 1000,
offerThroughput: undefined, // offerThroughput: undefined,
indexingPolicy: AllPropertiesIndexed, // indexingPolicy: AllPropertiesIndexed,
partitionKey: { // partitionKey: {
paths: ["/objectId"], // paths: ["/categoryId"],
kind: "Hash", // kind: "Hash",
version: 2, // version: 2,
}, // },
}; // };
await createCollection(params); // await createCollection(params);
await explorer.refreshAllDatabases(); // await explorer.refreshAllDatabases();
const database = useDatabases.getState().findDatabaseWithId(QueryCopilotSampleDatabaseId); const database = useDatabases.getState().findDatabaseWithId(QueryCopilotSampleDatabaseId);
await database.loadCollections(); await database.loadCollections();
const collection = database.findCollectionWithId("SampleContainer"); const collection = database.findCollectionWithId("SampleContainer");

View File

@@ -1,5 +1,5 @@
/* eslint-disable no-console */ /* eslint-disable no-console */
import { FeedOptions } from "@azure/cosmos"; import { FeedOptions, ItemDefinition, QueryIterator, Resource } from "@azure/cosmos";
import { import {
Callout, Callout,
CommandBarButton, CommandBarButton,
@@ -25,7 +25,8 @@ import {
import { getErrorMessage, handleError } from "Common/ErrorHandlingUtils"; import { getErrorMessage, handleError } from "Common/ErrorHandlingUtils";
import { shouldEnableCrossPartitionKey } from "Common/HeadersUtility"; import { shouldEnableCrossPartitionKey } from "Common/HeadersUtility";
import { MinimalQueryIterator } from "Common/IteratorUtilities"; import { MinimalQueryIterator } from "Common/IteratorUtilities";
import { queryDocuments } from "Common/dataAccess/queryDocuments"; import { sampleDataClient } from "Common/SampleDataClient";
import { getCommonQueryOptions } from "Common/dataAccess/queryDocuments";
import { queryDocumentsPage } from "Common/dataAccess/queryDocumentsPage"; import { queryDocumentsPage } from "Common/dataAccess/queryDocumentsPage";
import { QueryResults } from "Contracts/ViewModels"; import { QueryResults } from "Contracts/ViewModels";
import { CommandButtonComponentProps } from "Explorer/Controls/CommandButton/CommandButtonComponent"; import { CommandButtonComponentProps } from "Explorer/Controls/CommandButton/CommandButtonComponent";
@@ -199,9 +200,17 @@ export const QueryCopilotTab: React.FC<QueryCopilotTabProps> = ({
} }
}; };
const querySampleDocuments = (query: string, options: FeedOptions): QueryIterator<ItemDefinition & Resource> => {
options = getCommonQueryOptions(options);
return sampleDataClient()
.database(QueryCopilotSampleDatabaseId)
.container(QueryCopilotSampleContainerId)
.items.query(query, options);
};
const onExecuteQueryClick = async (): Promise<void> => { const onExecuteQueryClick = async (): Promise<void> => {
const queryToExecute = selectedQuery || query; const queryToExecute = selectedQuery || query;
const queryIterator = queryDocuments(QueryCopilotSampleDatabaseId, QueryCopilotSampleContainerId, queryToExecute, { const queryIterator = querySampleDocuments(queryToExecute, {
enableCrossPartitionQuery: shouldEnableCrossPartitionKey(), enableCrossPartitionQuery: shouldEnableCrossPartitionKey(),
} as FeedOptions); } as FeedOptions);
setQueryIterator(queryIterator); setQueryIterator(queryIterator);

View File

@@ -3,9 +3,6 @@ import { useNotebook } from "Explorer/Notebook/useNotebook";
import * as ko from "knockout"; import * as ko from "knockout";
import * as _ from "underscore"; import * as _ from "underscore";
import * as Constants from "../../Common/Constants"; import * as Constants from "../../Common/Constants";
import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils";
import * as Logger from "../../Common/Logger";
import { fetchPortalNotifications } from "../../Common/PortalNotifications";
import { bulkCreateDocument } from "../../Common/dataAccess/bulkCreateDocument"; import { bulkCreateDocument } from "../../Common/dataAccess/bulkCreateDocument";
import { createDocument } from "../../Common/dataAccess/createDocument"; import { createDocument } from "../../Common/dataAccess/createDocument";
import { getCollectionUsageSizeInKB } from "../../Common/dataAccess/getCollectionDataUsageSize"; import { getCollectionUsageSizeInKB } from "../../Common/dataAccess/getCollectionDataUsageSize";
@@ -13,16 +10,19 @@ import { readCollectionOffer } from "../../Common/dataAccess/readCollectionOffer
import { readStoredProcedures } from "../../Common/dataAccess/readStoredProcedures"; import { readStoredProcedures } from "../../Common/dataAccess/readStoredProcedures";
import { readTriggers } from "../../Common/dataAccess/readTriggers"; import { readTriggers } from "../../Common/dataAccess/readTriggers";
import { readUserDefinedFunctions } from "../../Common/dataAccess/readUserDefinedFunctions"; import { readUserDefinedFunctions } from "../../Common/dataAccess/readUserDefinedFunctions";
import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils";
import * as Logger from "../../Common/Logger";
import { fetchPortalNotifications } from "../../Common/PortalNotifications";
import * as DataModels from "../../Contracts/DataModels"; import * as DataModels from "../../Contracts/DataModels";
import * as ViewModels from "../../Contracts/ViewModels"; import * as ViewModels from "../../Contracts/ViewModels";
import { UploadDetailsRecord } from "../../Contracts/ViewModels"; import { UploadDetailsRecord } from "../../Contracts/ViewModels";
import { useTabs } from "../../hooks/useTabs";
import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants"; import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor"; import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import { userContext } from "../../UserContext"; import { userContext } from "../../UserContext";
import { SqlTriggerResource } from "../../Utils/arm/generatedClients/cosmos/types";
import { isServerlessAccount } from "../../Utils/CapabilityUtils"; import { isServerlessAccount } from "../../Utils/CapabilityUtils";
import { logConsoleInfo } from "../../Utils/NotificationConsoleUtils"; import { logConsoleInfo } from "../../Utils/NotificationConsoleUtils";
import { SqlTriggerResource } from "../../Utils/arm/generatedClients/cosmos/types";
import { useTabs } from "../../hooks/useTabs";
import Explorer from "../Explorer"; import Explorer from "../Explorer";
import { useCommandBar } from "../Menus/CommandBar/CommandBarComponentAdapter"; import { useCommandBar } from "../Menus/CommandBar/CommandBarComponentAdapter";
import { CassandraAPIDataClient, CassandraTableKey, CassandraTableKeys } from "../Tables/TableDataClient"; import { CassandraAPIDataClient, CassandraTableKey, CassandraTableKeys } from "../Tables/TableDataClient";

View File

@@ -2,10 +2,10 @@ import * as ko from "knockout";
import * as Constants from "../../Common/Constants"; import * as Constants from "../../Common/Constants";
import * as DataModels from "../../Contracts/DataModels"; import * as DataModels from "../../Contracts/DataModels";
import * as ViewModels from "../../Contracts/ViewModels"; import * as ViewModels from "../../Contracts/ViewModels";
import { useTabs } from "../../hooks/useTabs";
import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants"; import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor"; import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import { userContext } from "../../UserContext"; import { userContext } from "../../UserContext";
import { useTabs } from "../../hooks/useTabs";
import Explorer from "../Explorer"; import Explorer from "../Explorer";
import DocumentsTab from "../Tabs/DocumentsTab"; import DocumentsTab from "../Tabs/DocumentsTab";
import { NewQueryTab } from "../Tabs/QueryTab/QueryTab"; import { NewQueryTab } from "../Tabs/QueryTab/QueryTab";
@@ -105,9 +105,7 @@ export default class ResourceTokenCollection implements ViewModels.CollectionBas
); );
} }
public onDocumentDBDocumentsClick(isQueryCopilotCollection?: boolean, sampleCollection?: ViewModels.CollectionBase) { public onDocumentDBDocumentsClick() {
const queryCopilotPartitionKey: DataModels.PartitionKey = sampleCollection?.partitionKey;
useSelectedNode.getState().setSelectedNode(this); useSelectedNode.getState().setSelectedNode(this);
this.selectedSubnodeKind(ViewModels.CollectionTabKind.Documents); this.selectedSubnodeKind(ViewModels.CollectionTabKind.Documents);
TelemetryProcessor.trace(Action.SelectItem, ActionModifiers.Mark, { TelemetryProcessor.trace(Action.SelectItem, ActionModifiers.Mark, {
@@ -140,10 +138,8 @@ export default class ResourceTokenCollection implements ViewModels.CollectionBas
}); });
documentsTab = new DocumentsTab({ documentsTab = new DocumentsTab({
partitionKey: isQueryCopilotCollection ? queryCopilotPartitionKey : this.partitionKey, partitionKey: this.partitionKey,
resourceTokenPartitionKey: isQueryCopilotCollection resourceTokenPartitionKey: userContext.parsedResourceToken.partitionKey,
? queryCopilotPartitionKey.paths[0]
: userContext.parsedResourceToken.partitionKey,
documentIds: ko.observableArray<DocumentId>([]), documentIds: ko.observableArray<DocumentId>([]),
tabKind: ViewModels.CollectionTabKind.Documents, tabKind: ViewModels.CollectionTabKind.Documents,
title: "Items", title: "Items",

View File

@@ -1,7 +1,7 @@
import { mostRecentActivity } from "Explorer/MostRecentActivity/MostRecentActivity"; import { useCommandBar } from "Explorer/Menus/CommandBar/CommandBarComponentAdapter";
import TabsBase from "Explorer/Tabs/TabsBase";
import { useSelectedNode } from "Explorer/useSelectedNode"; import { useSelectedNode } from "Explorer/useSelectedNode";
import { userContext } from "UserContext"; import { useTabs } from "hooks/useTabs";
import { getItemName } from "Utils/APITypeUtils";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import CosmosDBIcon from "../../../images/Azure-Cosmos-DB.svg"; import CosmosDBIcon from "../../../images/Azure-Cosmos-DB.svg";
import CollectionIcon from "../../../images/tree-collection.svg"; import CollectionIcon from "../../../images/tree-collection.svg";
@@ -28,8 +28,18 @@ export const SampleDataTree = ({
label: sampleDataResourceTokenCollection.id(), label: sampleDataResourceTokenCollection.id(),
iconSrc: CollectionIcon, iconSrc: CollectionIcon,
isExpanded: false, isExpanded: false,
className: "sampleCollectionHeader", className: "dataResourceTree",
contextMenu: ResourceTreeContextMenuButtonFactory.createSampleCollectionContextMenuButton(), contextMenu: ResourceTreeContextMenuButtonFactory.createSampleCollectionContextMenuButton(),
onClick: () => {
// Rewritten version of expandCollapseCollection
useSelectedNode.getState().setSelectedNode(sampleDataResourceTokenCollection);
useCommandBar.getState().setContextButtons([]);
useTabs().refreshActiveTab(
(tab: TabsBase) =>
tab.collection?.id() === sampleDataResourceTokenCollection.id() &&
tab.collection.databaseId === sampleDataResourceTokenCollection.databaseId
);
},
isSelected: () => isSelected: () =>
useSelectedNode useSelectedNode
.getState() .getState()
@@ -40,24 +50,7 @@ export const SampleDataTree = ({
onContextMenuOpen: () => useSelectedNode.getState().setSelectedNode(sampleDataResourceTokenCollection), onContextMenuOpen: () => useSelectedNode.getState().setSelectedNode(sampleDataResourceTokenCollection),
children: [ children: [
{ {
label: getItemName(), label: "Items",
id: sampleDataResourceTokenCollection.isSampleCollection ? "sampleItems" : "",
contextMenu: ResourceTreeContextMenuButtonFactory.createSampleCollectionContextMenuButton(),
onClick: () => {
sampleDataResourceTokenCollection.onDocumentDBDocumentsClick(true, sampleDataResourceTokenCollection);
mostRecentActivity.collectionWasOpened(
userContext.databaseAccount?.id,
sampleDataResourceTokenCollection
);
},
isSelected: () =>
useSelectedNode
.getState()
.isDataNodeSelected(
sampleDataResourceTokenCollection.databaseId,
sampleDataResourceTokenCollection.id(),
[ViewModels.CollectionTabKind.Documents]
),
}, },
], ],
}, },

View File

@@ -63,7 +63,7 @@ initializeIcons();
const App: React.FunctionComponent = () => { const App: React.FunctionComponent = () => {
const [isLeftPaneExpanded, setIsLeftPaneExpanded] = useState<boolean>(true); const [isLeftPaneExpanded, setIsLeftPaneExpanded] = useState<boolean>(true);
const isCarouselOpen = useCarousel((state) => state.shouldOpen); const isCarouselOpen = useCarousel((state) => state.shouldOpen);
const isCopilotCarouselOpen = useCarousel((state) => state.showCopilotCarousel); // const isCopilotCarouselOpen = useCarousel((state) => state.showCopilotCarousel);
const shouldShowModal = useQueryCopilot((state) => state.showFeedbackModal); const shouldShowModal = useQueryCopilot((state) => state.showFeedbackModal);
const config = useConfig(); const config = useConfig();
@@ -127,7 +127,7 @@ const App: React.FunctionComponent = () => {
{<QuickstartCarousel isOpen={isCarouselOpen} />} {<QuickstartCarousel isOpen={isCarouselOpen} />}
{<SQLQuickstartTutorial />} {<SQLQuickstartTutorial />}
{<MongoQuickstartTutorial />} {<MongoQuickstartTutorial />}
{<QueryCopilotCarousel isOpen={isCopilotCarouselOpen} explorer={explorer} />} {<QueryCopilotCarousel isOpen={true} explorer={explorer} />}
{shouldShowModal && <QueryCopilotFeedbackModal />} {shouldShowModal && <QueryCopilotFeedbackModal />}
</div> </div>
); );

View File

@@ -47,6 +47,10 @@ export class JupyterLabAppFactory {
} }
public async createTerminalApp(serverSettings: ServerConnection.ISettings): Promise<ITerminalConnection | undefined> { public async createTerminalApp(serverSettings: ServerConnection.ISettings): Promise<ITerminalConnection | undefined> {
//Need to add this after we remove passing token through url
//const configurationSettings: Partial<ServerConnection.ISettings> = serverSettings;
//(configurationSettings.appendToken as boolean) = false;
//serverSettings = ServerConnection.makeSettings(configurationSettings);
const manager = new TerminalManager({ const manager = new TerminalManager({
serverSettings: serverSettings, serverSettings: serverSettings,
}); });
@@ -64,6 +68,11 @@ export class JupyterLabAppFactory {
} }
}, this); }, this);
let internalSend = session.send;
session.send = (message: IMessage) => {
message?.content?.push(serverSettings?.token);
internalSend.call(session, message);
};
const term = new Terminal(session, { theme: "dark", shutdownOnClose: true }); const term = new Terminal(session, { theme: "dark", shutdownOnClose: true });
if (!term) { if (!term) {