function openCollectionTab()

in src/Explorer/OpenActions/OpenActions.tsx [40:183]


function openCollectionTab(
  action: ActionContracts.OpenCollectionTab,
  databases: ViewModels.Database[],
  initialDatabaseIndex = 0,
) {
  //if databases are not yet loaded, wait until loaded
  if (!databases || databases.length === 0) {
    const databaseActionHandler = (databases: ViewModels.Database[]) => {
      databasesUnsubscription();
      openCollectionTab(action, databases, 0);
      return;
    };
    const databasesUnsubscription = useDatabases.subscribe(databaseActionHandler, (state) => state.databases);
  } else {
    for (let i = initialDatabaseIndex; i < databases.length; i++) {
      const database: ViewModels.Database = databases[i];
      if (!!action.databaseResourceId && database.id() !== action.databaseResourceId) {
        continue;
      }

      if (
        isFabricMirrored() &&
        !(
          // whitelist the tab kinds that are allowed to be opened in Fabric mirrored
          (
            action.tabKind === ActionContracts.TabKind.SQLDocuments ||
            action.tabKind === ActionContracts.TabKind.SQLQuery
          )
        )
      ) {
        continue;
      }

      //expand database first if not expanded to load the collections
      if (!database.isDatabaseExpanded?.()) {
        database.expandDatabase?.();
      }

      const collectionActionHandler = (collections: ViewModels.Collection[]) => {
        if (!action.collectionResourceId && collections.length === 0) {
          subscription.dispose();
          openCollectionTab(action, databases, ++i);
          return;
        }

        for (let j = 0; j < collections.length; j++) {
          const collection: ViewModels.Collection = collections[j];
          if (!!action.collectionResourceId && collection.id() !== action.collectionResourceId) {
            continue;
          }

          // select the collection
          collection.expandCollection();

          if (
            action.tabKind === ActionContracts.TabKind.SQLDocuments ||
            action.tabKind === ActionContracts.TabKind[ActionContracts.TabKind.SQLDocuments]
          ) {
            collection.onDocumentDBDocumentsClick();
            break;
          }

          if (
            action.tabKind === ActionContracts.TabKind.MongoDocuments ||
            action.tabKind === ActionContracts.TabKind[ActionContracts.TabKind.MongoDocuments]
          ) {
            collection.onMongoDBDocumentsClick();
            break;
          }

          if (
            action.tabKind === ActionContracts.TabKind.SchemaAnalyzer ||
            action.tabKind === ActionContracts.TabKind[ActionContracts.TabKind.SchemaAnalyzer]
          ) {
            collection.onSchemaAnalyzerClick();
            break;
          }

          if (
            action.tabKind === ActionContracts.TabKind.TableEntities ||
            action.tabKind === ActionContracts.TabKind[ActionContracts.TabKind.TableEntities]
          ) {
            collection.onTableEntitiesClick();
            break;
          }

          if (
            action.tabKind === ActionContracts.TabKind.Graph ||
            action.tabKind === ActionContracts.TabKind[ActionContracts.TabKind.Graph]
          ) {
            collection.onGraphDocumentsClick();
            break;
          }

          if (
            action.tabKind === ActionContracts.TabKind.SQLQuery ||
            action.tabKind === ActionContracts.TabKind[ActionContracts.TabKind.SQLQuery]
          ) {
            const openQueryTabAction = action as ActionContracts.OpenQueryTab;
            collection.onNewQueryClick(
              collection,
              undefined,
              generateQueryText(openQueryTabAction, collection.partitionKeyProperties),
              openQueryTabAction.splitterDirection,
              openQueryTabAction.queryViewSizePercent,
            );
            break;
          }

          if (
            action.tabKind === ActionContracts.TabKind.MongoQuery ||
            action.tabKind === ActionContracts.TabKind[ActionContracts.TabKind.MongoQuery]
          ) {
            const openQueryTabAction = action as ActionContracts.OpenQueryTab;
            collection.onNewMongoQueryClick(
              collection,
              undefined,
              generateQueryText(openQueryTabAction, collection.partitionKeyProperties),
              openQueryTabAction.splitterDirection,
              openQueryTabAction.queryViewSizePercent,
            );
            break;
          }

          if (
            action.tabKind === ActionContracts.TabKind.ScaleSettings ||
            action.tabKind === ActionContracts.TabKind[ActionContracts.TabKind.ScaleSettings]
          ) {
            collection.onSettingsClick();
            break;
          }
        }
        subscription.dispose();
      };

      const subscription = database.collections.subscribe((collections) => collectionActionHandler(collections));
      if (database.collections && database.collections() && database.collections().length) {
        collectionActionHandler(database.collections());
      }

      break;
    }
  }
}