diff --git a/src/Explorer/ContextMenuButtonFactory.ts b/src/Explorer/ContextMenuButtonFactory.ts index ed0ef9a59..42eac8d44 100644 --- a/src/Explorer/ContextMenuButtonFactory.ts +++ b/src/Explorer/ContextMenuButtonFactory.ts @@ -11,12 +11,12 @@ import DeleteUDFIcon from "../../images/DeleteUDF.svg"; import HostedTerminalIcon from "../../images/Hosted-Terminal.svg"; import * as ViewModels from "../Contracts/ViewModels"; import { userContext } from "../UserContext"; +import { getCollectionName, getDatabaseName } from "../Utils/APITypeUtils"; import { TreeNodeMenuItem } from "./Controls/TreeComponent/TreeComponent"; import Explorer from "./Explorer"; import StoredProcedure from "./Tree/StoredProcedure"; import Trigger from "./Tree/Trigger"; import UserDefinedFunction from "./Tree/UserDefinedFunction"; - export interface CollectionContextMenuButtonParams { databaseId: string; collectionId: string; @@ -34,7 +34,7 @@ export class ResourceTreeContextMenuButtonFactory { { iconSrc: AddCollectionIcon, onClick: () => container.onNewCollectionClicked(databaseId), - label: container.addCollectionText(), + label: `New ${getCollectionName()}`, }, ]; @@ -42,7 +42,7 @@ export class ResourceTreeContextMenuButtonFactory { items.push({ iconSrc: DeleteDatabaseIcon, onClick: () => container.openDeleteDatabaseConfirmationPane(), - label: container.deleteDatabaseText(), + label: `Delete ${getDatabaseName()}`, styleClass: "deleteDatabaseMenuItem", }); } @@ -115,7 +115,7 @@ export class ResourceTreeContextMenuButtonFactory { items.push({ iconSrc: DeleteCollectionIcon, onClick: () => container.openDeleteCollectionConfirmationPane(), - label: container.deleteCollectionText(), + label: `Delete ${getCollectionName()}`, styleClass: "deleteCollectionMenuItem", }); diff --git a/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap b/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap index dc217ed3f..f22c5a08b 100644 --- a/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap +++ b/src/Explorer/Controls/Settings/__snapshots__/SettingsComponent.test.tsx.snap @@ -32,7 +32,6 @@ exports[`SettingsComponent renders 1`] = ` "_isInitializingNotebooks": false, "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionText": [Function], "arcadiaToken": [Function], "canExceedMaximumValue": [Function], "canSaveQueries": [Function], @@ -48,8 +47,6 @@ exports[`SettingsComponent renders 1`] = ` "unlimitedmin": 400, }, }, - "collectionTitle": [Function], - "collectionTreeNodeAltText": [Function], "commandBarComponentAdapter": CommandBarComponentAdapter { "container": [Circular], "isNotebookTabActive": [Function], @@ -57,8 +54,6 @@ exports[`SettingsComponent renders 1`] = ` "tabsButtons": Array [], }, "databases": [Function], - "deleteCollectionText": [Function], - "deleteDatabaseText": [Function], "gitHubClient": GitHubClient { "errorCallback": [Function], "ocktokit": OctokitWithDefaults { @@ -858,7 +853,6 @@ exports[`SettingsComponent renders 1`] = ` "container": [Circular], }, "refreshNotebookList": [Function], - "refreshTreeTitle": [Function], "resourceTokenCollection": [Function], "resourceTokenCollectionId": [Function], "resourceTokenDatabaseId": [Function], @@ -923,7 +917,6 @@ exports[`SettingsComponent renders 1`] = ` "_isInitializingNotebooks": false, "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionText": [Function], "arcadiaToken": [Function], "canExceedMaximumValue": [Function], "canSaveQueries": [Function], @@ -939,8 +932,6 @@ exports[`SettingsComponent renders 1`] = ` "unlimitedmin": 400, }, }, - "collectionTitle": [Function], - "collectionTreeNodeAltText": [Function], "commandBarComponentAdapter": CommandBarComponentAdapter { "container": [Circular], "isNotebookTabActive": [Function], @@ -948,8 +939,6 @@ exports[`SettingsComponent renders 1`] = ` "tabsButtons": Array [], }, "databases": [Function], - "deleteCollectionText": [Function], - "deleteDatabaseText": [Function], "gitHubClient": GitHubClient { "errorCallback": [Function], "ocktokit": OctokitWithDefaults { @@ -1749,7 +1738,6 @@ exports[`SettingsComponent renders 1`] = ` "container": [Circular], }, "refreshNotebookList": [Function], - "refreshTreeTitle": [Function], "resourceTokenCollection": [Function], "resourceTokenCollectionId": [Function], "resourceTokenDatabaseId": [Function], @@ -1827,7 +1815,6 @@ exports[`SettingsComponent renders 1`] = ` "_isInitializingNotebooks": false, "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionText": [Function], "arcadiaToken": [Function], "canExceedMaximumValue": [Function], "canSaveQueries": [Function], @@ -1843,8 +1830,6 @@ exports[`SettingsComponent renders 1`] = ` "unlimitedmin": 400, }, }, - "collectionTitle": [Function], - "collectionTreeNodeAltText": [Function], "commandBarComponentAdapter": CommandBarComponentAdapter { "container": [Circular], "isNotebookTabActive": [Function], @@ -1852,8 +1837,6 @@ exports[`SettingsComponent renders 1`] = ` "tabsButtons": Array [], }, "databases": [Function], - "deleteCollectionText": [Function], - "deleteDatabaseText": [Function], "gitHubClient": GitHubClient { "errorCallback": [Function], "ocktokit": OctokitWithDefaults { @@ -2653,7 +2636,6 @@ exports[`SettingsComponent renders 1`] = ` "container": [Circular], }, "refreshNotebookList": [Function], - "refreshTreeTitle": [Function], "resourceTokenCollection": [Function], "resourceTokenCollectionId": [Function], "resourceTokenDatabaseId": [Function], @@ -2718,7 +2700,6 @@ exports[`SettingsComponent renders 1`] = ` "_isInitializingNotebooks": false, "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionText": [Function], "arcadiaToken": [Function], "canExceedMaximumValue": [Function], "canSaveQueries": [Function], @@ -2734,8 +2715,6 @@ exports[`SettingsComponent renders 1`] = ` "unlimitedmin": 400, }, }, - "collectionTitle": [Function], - "collectionTreeNodeAltText": [Function], "commandBarComponentAdapter": CommandBarComponentAdapter { "container": [Circular], "isNotebookTabActive": [Function], @@ -2743,8 +2722,6 @@ exports[`SettingsComponent renders 1`] = ` "tabsButtons": Array [], }, "databases": [Function], - "deleteCollectionText": [Function], - "deleteDatabaseText": [Function], "gitHubClient": GitHubClient { "errorCallback": [Function], "ocktokit": OctokitWithDefaults { @@ -3544,7 +3521,6 @@ exports[`SettingsComponent renders 1`] = ` "container": [Circular], }, "refreshNotebookList": [Function], - "refreshTreeTitle": [Function], "resourceTokenCollection": [Function], "resourceTokenCollectionId": [Function], "resourceTokenDatabaseId": [Function], diff --git a/src/Explorer/Explorer.tsx b/src/Explorer/Explorer.tsx index c8fb2cd20..36a3ff6a4 100644 --- a/src/Explorer/Explorer.tsx +++ b/src/Explorer/Explorer.tsx @@ -97,12 +97,6 @@ export interface ExplorerParams { } export default class Explorer { - public addCollectionText: ko.Observable; - public collectionTitle: ko.Observable; - public deleteCollectionText: ko.Observable; - public deleteDatabaseText: ko.Observable; - public collectionTreeNodeAltText: ko.Observable; - public refreshTreeTitle: ko.Observable; public collapsedResourceTreeWidth: number = ExplorerMetrics.CollapsedResourceTreeWidth; public collectionCreationDefaults: ViewModels.CollectionCreationDefaults = SharedConstants.CollectionCreationDefaults; @@ -199,13 +193,6 @@ export default class Explorer { const startKey: number = TelemetryProcessor.traceStart(Action.InitializeDataExplorer, { dataExplorerArea: Constants.Areas.ResourceTree, }); - this.addCollectionText = ko.observable("New Collection"); - this.collectionTitle = ko.observable("Collections"); - this.collectionTreeNodeAltText = ko.observable("Collection"); - this.deleteCollectionText = ko.observable("Delete Collection"); - this.deleteDatabaseText = ko.observable("Delete Database"); - this.refreshTreeTitle = ko.observable("Refresh collections"); - this.isAccountReady = ko.observable(false); this._isInitializingNotebooks = false; this.arcadiaToken = ko.observable(); @@ -420,46 +407,10 @@ export default class Explorer { }); switch (userContext.apiType) { - case "SQL": - this.addCollectionText("New Container"); - this.collectionTitle("SQL API"); - this.collectionTreeNodeAltText("Container"); - this.deleteCollectionText("Delete Container"); - this.deleteDatabaseText("Delete Database"); - this.refreshTreeTitle("Refresh containers"); - break; - case "Mongo": - this.addCollectionText("New Collection"); - this.collectionTitle("Collections"); - this.collectionTreeNodeAltText("Collection"); - this.deleteCollectionText("Delete Collection"); - this.deleteDatabaseText("Delete Database"); - this.refreshTreeTitle("Refresh collections"); - break; - case "Gremlin": - this.addCollectionText("New Graph"); - this.deleteCollectionText("Delete Graph"); - this.deleteDatabaseText("Delete Database"); - this.collectionTitle("Gremlin API"); - this.collectionTreeNodeAltText("Graph"); - this.refreshTreeTitle("Refresh graphs"); - break; case "Tables": - this.addCollectionText("New Table"); - this.deleteCollectionText("Delete Table"); - this.deleteDatabaseText("Delete Database"); - this.collectionTitle("Azure Table API"); - this.collectionTreeNodeAltText("Table"); - this.refreshTreeTitle("Refresh tables"); this.tableDataClient = new TablesAPIDataClient(); break; case "Cassandra": - this.addCollectionText("New Table"); - this.deleteCollectionText("Delete Table"); - this.deleteDatabaseText("Delete Keyspace"); - this.collectionTitle("Cassandra API"); - this.collectionTreeNodeAltText("Table"); - this.refreshTreeTitle("Refresh tables"); this.tableDataClient = new CassandraAPIDataClient(); break; } diff --git a/src/Explorer/Menus/CommandBar/CommandBarComponentAdapter.tsx b/src/Explorer/Menus/CommandBar/CommandBarComponentAdapter.tsx index 269466866..d4e4c444d 100644 --- a/src/Explorer/Menus/CommandBar/CommandBarComponentAdapter.tsx +++ b/src/Explorer/Menus/CommandBar/CommandBarComponentAdapter.tsx @@ -30,9 +30,6 @@ export class CommandBarComponentAdapter implements ReactAdapter { // These are the parameters watched by the react binding that will trigger a renderComponent() if one of the ko mutates const toWatch = [ - container.deleteCollectionText, - container.deleteDatabaseText, - container.addCollectionText, container.isDatabaseNodeOrNoneSelected, container.isDatabaseNodeSelected, container.isNoneSelected, diff --git a/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.test.ts b/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.test.ts index 63172c8d5..61b8126bc 100644 --- a/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.test.ts +++ b/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.test.ts @@ -15,7 +15,6 @@ describe("CommandBarComponentButtonFactory tests", () => { beforeAll(() => { mockExplorer = {} as Explorer; - mockExplorer.addCollectionText = ko.observable("mockText"); updateUserContext({ databaseAccount: { properties: { @@ -58,7 +57,6 @@ describe("CommandBarComponentButtonFactory tests", () => { beforeAll(() => { mockExplorer = {} as Explorer; - mockExplorer.addCollectionText = ko.observable("mockText"); updateUserContext({ databaseAccount: { properties: { @@ -126,7 +124,6 @@ describe("CommandBarComponentButtonFactory tests", () => { beforeAll(() => { mockExplorer = {} as Explorer; - mockExplorer.addCollectionText = ko.observable("mockText"); updateUserContext({ databaseAccount: { properties: { @@ -226,7 +223,6 @@ describe("CommandBarComponentButtonFactory tests", () => { beforeAll(() => { mockExplorer = {} as Explorer; - mockExplorer.addCollectionText = ko.observable("mockText"); updateUserContext({ databaseAccount: { properties: { @@ -318,7 +314,6 @@ describe("CommandBarComponentButtonFactory tests", () => { beforeAll(() => { mockExplorer = {} as Explorer; - mockExplorer.addCollectionText = ko.observable("mockText"); updateUserContext({ databaseAccount: { properties: { @@ -380,7 +375,6 @@ describe("CommandBarComponentButtonFactory tests", () => { describe("Resource token", () => { beforeAll(() => { mockExplorer = {} as Explorer; - mockExplorer.addCollectionText = ko.observable("mockText"); mockExplorer.isDatabaseNodeOrNoneSelected = () => true; mockExplorer.isResourceTokenCollectionNodeSelected = ko.computed(() => true); mockExplorer.isServerlessEnabled = ko.computed(() => false); diff --git a/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx b/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx index 41c1bb9e9..736dcef56 100644 --- a/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx +++ b/src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx @@ -22,7 +22,7 @@ import * as Constants from "../../../Common/Constants"; import { configContext, Platform } from "../../../ConfigContext"; import * as ViewModels from "../../../Contracts/ViewModels"; import { userContext } from "../../../UserContext"; -import { getDatabaseName } from "../../../Utils/APITypeUtils"; +import { getCollectionName, getDatabaseName } from "../../../Utils/APITypeUtils"; import { CommandButtonComponentProps } from "../../Controls/CommandButton/CommandButtonComponent"; import Explorer from "../../Explorer"; import { OpenFullScreen } from "../../OpenFullScreen"; @@ -215,7 +215,7 @@ function areScriptsSupported(): boolean { } function createNewCollectionGroup(container: Explorer): CommandButtonComponentProps { - const label = container.addCollectionText(); + const label = `New ${getCollectionName()}`; return { iconSrc: AddCollectionIcon, iconAlt: label, diff --git a/src/Explorer/Panes/GitHubReposPanel/__snapshots__/GitHubReposPanel.test.tsx.snap b/src/Explorer/Panes/GitHubReposPanel/__snapshots__/GitHubReposPanel.test.tsx.snap index 5161fa5ad..c3e8dfd95 100644 --- a/src/Explorer/Panes/GitHubReposPanel/__snapshots__/GitHubReposPanel.test.tsx.snap +++ b/src/Explorer/Panes/GitHubReposPanel/__snapshots__/GitHubReposPanel.test.tsx.snap @@ -21,7 +21,6 @@ exports[`GitHub Repos Panel should render Default properly 1`] = ` "_isInitializingNotebooks": false, "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionText": [Function], "arcadiaToken": [Function], "canExceedMaximumValue": [Function], "canSaveQueries": [Function], @@ -37,8 +36,6 @@ exports[`GitHub Repos Panel should render Default properly 1`] = ` "unlimitedmin": 400, }, }, - "collectionTitle": [Function], - "collectionTreeNodeAltText": [Function], "commandBarComponentAdapter": CommandBarComponentAdapter { "container": [Circular], "isNotebookTabActive": [Function], @@ -46,8 +43,6 @@ exports[`GitHub Repos Panel should render Default properly 1`] = ` "tabsButtons": Array [], }, "databases": [Function], - "deleteCollectionText": [Function], - "deleteDatabaseText": [Function], "gitHubClient": GitHubClient { "errorCallback": [Function], "ocktokit": OctokitWithDefaults { @@ -847,7 +842,6 @@ exports[`GitHub Repos Panel should render Default properly 1`] = ` "container": [Circular], }, "refreshNotebookList": [Function], - "refreshTreeTitle": [Function], "resourceTokenCollection": [Function], "resourceTokenCollectionId": [Function], "resourceTokenDatabaseId": [Function], diff --git a/src/Explorer/Panes/StringInputPane/__snapshots__/StringInputPane.test.tsx.snap b/src/Explorer/Panes/StringInputPane/__snapshots__/StringInputPane.test.tsx.snap index 1a94f3ffd..fdb9510fb 100644 --- a/src/Explorer/Panes/StringInputPane/__snapshots__/StringInputPane.test.tsx.snap +++ b/src/Explorer/Panes/StringInputPane/__snapshots__/StringInputPane.test.tsx.snap @@ -11,7 +11,6 @@ exports[`StringInput Pane should render Create new directory properly 1`] = ` "_isInitializingNotebooks": false, "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionText": [Function], "arcadiaToken": [Function], "canExceedMaximumValue": [Function], "canSaveQueries": [Function], @@ -27,8 +26,6 @@ exports[`StringInput Pane should render Create new directory properly 1`] = ` "unlimitedmin": 400, }, }, - "collectionTitle": [Function], - "collectionTreeNodeAltText": [Function], "commandBarComponentAdapter": CommandBarComponentAdapter { "container": [Circular], "isNotebookTabActive": [Function], @@ -36,8 +33,6 @@ exports[`StringInput Pane should render Create new directory properly 1`] = ` "tabsButtons": Array [], }, "databases": [Function], - "deleteCollectionText": [Function], - "deleteDatabaseText": [Function], "gitHubClient": GitHubClient { "errorCallback": [Function], "ocktokit": OctokitWithDefaults { @@ -837,7 +832,6 @@ exports[`StringInput Pane should render Create new directory properly 1`] = ` "container": [Circular], }, "refreshNotebookList": [Function], - "refreshTreeTitle": [Function], "resourceTokenCollection": [Function], "resourceTokenCollectionId": [Function], "resourceTokenDatabaseId": [Function], diff --git a/src/Explorer/Panes/__snapshots__/DeleteDatabaseConfirmationPanel.test.tsx.snap b/src/Explorer/Panes/__snapshots__/DeleteDatabaseConfirmationPanel.test.tsx.snap index 6b2279be0..1d927e3b8 100644 --- a/src/Explorer/Panes/__snapshots__/DeleteDatabaseConfirmationPanel.test.tsx.snap +++ b/src/Explorer/Panes/__snapshots__/DeleteDatabaseConfirmationPanel.test.tsx.snap @@ -9,7 +9,6 @@ exports[`Delete Database Confirmation Pane submit() Should call delete database "_isInitializingNotebooks": false, "_refreshSparkEnabledStateForAccount": [Function], "_resetNotebookWorkspace": [Function], - "addCollectionText": [Function], "arcadiaToken": [Function], "canExceedMaximumValue": [Function], "canSaveQueries": [Function], @@ -25,8 +24,6 @@ exports[`Delete Database Confirmation Pane submit() Should call delete database "unlimitedmin": 400, }, }, - "collectionTitle": [Function], - "collectionTreeNodeAltText": [Function], "commandBarComponentAdapter": CommandBarComponentAdapter { "container": [Circular], "isNotebookTabActive": [Function], @@ -34,8 +31,6 @@ exports[`Delete Database Confirmation Pane submit() Should call delete database "tabsButtons": Array [], }, "databases": [Function], - "deleteCollectionText": [Function], - "deleteDatabaseText": [Function], "gitHubClient": GitHubClient { "errorCallback": [Function], "ocktokit": OctokitWithDefaults { @@ -839,7 +834,6 @@ exports[`Delete Database Confirmation Pane submit() Should call delete database }, "refreshAllDatabases": [Function], "refreshNotebookList": [Function], - "refreshTreeTitle": [Function], "resourceTokenCollection": [Function], "resourceTokenCollectionId": [Function], "resourceTokenDatabaseId": [Function], diff --git a/src/Explorer/SplashScreen/SplashScreen.test.ts b/src/Explorer/SplashScreen/SplashScreen.test.ts index 68c4c1108..dfa928992 100644 --- a/src/Explorer/SplashScreen/SplashScreen.test.ts +++ b/src/Explorer/SplashScreen/SplashScreen.test.ts @@ -1,15 +1,14 @@ import * as ko from "knockout"; import { DataSamplesUtil } from "../DataSamples/DataSamplesUtil"; -import { SplashScreen } from "./SplashScreen"; -import { TabsManager } from "../Tabs/TabsManager"; import Explorer from "../Explorer"; +import { TabsManager } from "../Tabs/TabsManager"; +import { SplashScreen } from "./SplashScreen"; jest.mock("../Explorer"); const createExplorer = () => { const mock = new Explorer(); mock.selectedNode = ko.observable(); mock.isNotebookEnabled = ko.observable(false); - mock.addCollectionText = ko.observable("add collection"); mock.tabsManager = new TabsManager(); return mock as jest.Mocked; }; diff --git a/src/Explorer/SplashScreen/SplashScreen.tsx b/src/Explorer/SplashScreen/SplashScreen.tsx index 34211d821..7d8e65337 100644 --- a/src/Explorer/SplashScreen/SplashScreen.tsx +++ b/src/Explorer/SplashScreen/SplashScreen.tsx @@ -17,7 +17,7 @@ import { AuthType } from "../../AuthType"; import * as Constants from "../../Common/Constants"; import * as ViewModels from "../../Contracts/ViewModels"; import { userContext } from "../../UserContext"; -import { getDatabaseName } from "../../Utils/APITypeUtils"; +import { getCollectionName, getDatabaseName } from "../../Utils/APITypeUtils"; import { FeaturePanelLauncher } from "../Controls/FeaturePanel/FeaturePanelLauncher"; import { DataSamplesUtil } from "../DataSamples/DataSamplesUtil"; import Explorer from "../Explorer"; @@ -192,7 +192,7 @@ export class SplashScreen extends React.Component { const heroes: SplashScreenItem[] = [ { iconSrc: NewContainerIcon, - title: this.container.addCollectionText(), + title: `New ${getCollectionName()}`, description: "Create a new container for storage and throughput", onClick: () => this.container.onNewCollectionClicked(), }, diff --git a/src/Explorer/Tree/Collection.test.ts b/src/Explorer/Tree/Collection.test.ts index 7e185ef4a..3e054f8a0 100644 --- a/src/Explorer/Tree/Collection.test.ts +++ b/src/Explorer/Tree/Collection.test.ts @@ -1,4 +1,3 @@ -import * as ko from "knockout"; import * as DataModels from "../../Contracts/DataModels"; import Explorer from "../Explorer"; import Collection from "./Collection"; @@ -36,8 +35,6 @@ describe("Collection", () => { return false; }; - mockContainer.deleteCollectionText = ko.observable("delete collection"); - return generateCollection(mockContainer, "abc", data, {} as DataModels.Offer); } diff --git a/src/Main.tsx b/src/Main.tsx index 6b7eb445e..43c26dcf1 100644 --- a/src/Main.tsx +++ b/src/Main.tsx @@ -55,6 +55,7 @@ import { useTabs } from "./hooks/useTabs"; import "./Libs/jquery"; import "./Shared/appInsights"; import { userContext } from "./UserContext"; +import { getCollectionName } from "./Utils/APITypeUtils"; initializeIcons(); @@ -83,6 +84,8 @@ const App: React.FunctionComponent = () => { return ; } + const collectionTitle = `${getCollectionName()} API`; + const refreshTreeTitle = `Refresh ${getCollectionName()}`; return (
@@ -105,7 +108,7 @@ const App: React.FunctionComponent = () => { {/* Collections Window Title/Command Bar - Start */}
- + {collectionTitle}
{ aria-label="Refresh tree" title="Refresh tree" > - + {refreshTreeTitle} { data-bind=" click: toggleLeftPaneExpanded" > - + {collectionTitle}