Skip to content

Commit c184d26

Browse files
authored
chore(compass-schema-validation): convert to TS and new-style plugin COMPASS-7476 (#5154)
1 parent 2e47c57 commit c184d26

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1486
-1282
lines changed

package-lock.json

Lines changed: 16 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import React, { useContext, useRef } from 'react';
2+
import type { CollectionTabPluginMetadata } from '../modules/collection-tab';
3+
4+
export interface CollectionTabPlugin {
5+
name: string;
6+
component: React.ComponentType<CollectionTabPluginMetadata>;
7+
}
8+
9+
const CollectionTabsContext = React.createContext<CollectionTabPlugin[]>([]);
10+
11+
export const CollectionTabsProvider: React.FunctionComponent<{
12+
tabs: CollectionTabPlugin[];
13+
}> = ({ tabs, children }) => {
14+
const tabsRef = useRef(tabs);
15+
return (
16+
<CollectionTabsContext.Provider value={tabsRef.current}>
17+
{children}
18+
</CollectionTabsContext.Provider>
19+
);
20+
};
21+
22+
export function useCollectionTabPlugins(): CollectionTabPlugin[] {
23+
return useContext(CollectionTabsContext);
24+
}

packages/compass-collection/src/components/collection-tab.tsx

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useEffect } from 'react';
2-
import type { Store } from 'redux';
32
import { connect, Provider } from 'react-redux';
3+
import type { CollectionTabPluginMetadata } from '../modules/collection-tab';
44
import {
55
returnToView,
66
selectDatabase,
@@ -9,10 +9,13 @@ import {
99
selectTab,
1010
renderScopedModals,
1111
renderTabs,
12+
createCollectionStoreMetadata,
1213
} from '../modules/collection-tab';
1314
import { css, ErrorBoundary, TabNavBar } from '@mongodb-js/compass-components';
1415
import CollectionHeader from './collection-header';
1516
import { createLoggerAndTelemetry } from '@mongodb-js/compass-logging';
17+
import type { configureStore } from '../stores/collection-tab';
18+
import { useCollectionTabPlugins } from './collection-tab-provider';
1619

1720
const { log, mongoLogId, track } = createLoggerAndTelemetry(
1821
'COMPASS-COLLECTION-TAB-UI'
@@ -58,11 +61,26 @@ const collectionModalContainerStyles = css({
5861

5962
const CollectionTab: React.FunctionComponent<{
6063
currentTab: string;
64+
collectionTabPluginMetadata: CollectionTabPluginMetadata;
6165
renderScopedModals(): React.ReactElement[];
6266
renderTabs(): { name: string; component: React.ReactElement }[];
6367
onTabClick(name: string): void;
64-
}> = ({ currentTab, renderScopedModals, renderTabs, onTabClick }) => {
65-
const tabs = renderTabs();
68+
}> = ({
69+
currentTab,
70+
collectionTabPluginMetadata,
71+
renderScopedModals,
72+
renderTabs,
73+
onTabClick,
74+
}) => {
75+
const pluginTabs = useCollectionTabPlugins();
76+
const legacyTabs = renderTabs();
77+
const tabs = [
78+
...legacyTabs,
79+
...pluginTabs.map(({ name, component: Component }) => ({
80+
name,
81+
component: <Component {...collectionTabPluginMetadata} />,
82+
})),
83+
];
6684
const activeTabIndex = tabs.findIndex((tab) => tab.name === currentTab);
6785

6886
useEffect(() => {
@@ -121,6 +139,7 @@ const ConnectedCollectionTab = connect(
121139
(state: CollectionState) => {
122140
return {
123141
currentTab: state.currentTab,
142+
collectionTabPluginMetadata: createCollectionStoreMetadata(state),
124143
};
125144
},
126145
{
@@ -130,9 +149,9 @@ const ConnectedCollectionTab = connect(
130149
}
131150
)(CollectionTab);
132151

133-
const CollectionTabPlugin: React.FunctionComponent<{ store: Store }> = ({
134-
store,
135-
}) => {
152+
const CollectionTabPlugin: React.FunctionComponent<{
153+
store: ReturnType<typeof configureStore>;
154+
}> = ({ store }) => {
136155
return (
137156
<Provider store={store}>
138157
<ConnectedCollectionTab></ConnectedCollectionTab>

packages/compass-collection/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,5 @@ function deactivate(appRegistry: AppRegistry): void {
3333
export default CollectionTabsPlugin;
3434
export { activate, deactivate };
3535
export { default as metadata } from '../package.json';
36+
export type { CollectionTabPluginMetadata } from './modules/collection-tab';
37+
export { CollectionTabsProvider } from './components/collection-tab-provider';

packages/compass-collection/src/modules/collection-tab.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ export const selectTab = (
137137
localAppRegistry.emit('subtab-changed', tabName);
138138
};
139139
};
140-
141140
export const selectDatabase = (): CollectionThunkAction<void> => {
142141
return (dispatch, getState, { globalAppRegistry }) => {
143142
const { metadata } = getState();
@@ -164,6 +163,20 @@ export const returnToView = (): CollectionThunkAction<void> => {
164163
};
165164
};
166165

166+
export function createCollectionStoreMetadata(state: CollectionState) {
167+
return {
168+
...state.metadata,
169+
query: state.initialQuery,
170+
aggregation: state.initialAggregation,
171+
pipelineText: state.initialPipelineText,
172+
editViewName: state.editViewName,
173+
};
174+
}
175+
176+
export type CollectionTabPluginMetadata = ReturnType<
177+
typeof createCollectionStoreMetadata
178+
>;
179+
167180
const setupRole = (
168181
roleName: string
169182
): CollectionThunkAction<{ name: string; component: React.ReactElement }[]> => {
@@ -187,7 +200,7 @@ const setupRole = (
187200
} = role;
188201

189202
const collectionStoreMetadata = {
190-
...getState().metadata,
203+
...createCollectionStoreMetadata(getState()),
191204
localAppRegistry,
192205
globalAppRegistry,
193206
dataProvider: {
@@ -196,10 +209,6 @@ const setupRole = (
196209
error: null,
197210
dataProvider: dataService,
198211
},
199-
query: getState().initialQuery,
200-
aggregation: getState().initialAggregation,
201-
pipelineText: getState().initialPipelineText,
202-
editViewName: getState().editViewName,
203212
};
204213

205214
let actions;

packages/compass-collection/src/modules/tabs.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22
import type { AnyAction, Reducer } from 'redux';
33
import type { ThunkAction } from 'redux-thunk';
4-
import AppRegistry from 'hadron-app-registry';
4+
import AppRegistry, { AppRegistryProvider } from 'hadron-app-registry';
55
import { ObjectId } from 'bson';
66
import type { CollectionMetadata } from 'mongodb-collection-model';
77
import type { DataService } from 'mongodb-data-service';
@@ -213,8 +213,12 @@ const createNewTab = (
213213
localAppRegistry,
214214
...collectionMetadata,
215215
});
216-
const component = React.createElement(collectionTabRole.component, {
217-
store,
216+
const component = React.createElement(AppRegistryProvider, {
217+
localAppRegistry: localAppRegistry,
218+
deactivateOnUnmount: false,
219+
children: React.createElement(collectionTabRole.component, {
220+
store,
221+
}),
218222
});
219223
const tab: CollectionTab = {
220224
id: new ObjectId().toHexString(),

packages/compass-home/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"@mongodb-js/atlas-service": "^0.10.1",
3838
"@mongodb-js/compass-aggregations": "^9.20.0",
3939
"@mongodb-js/compass-app-stores": "^7.6.1",
40+
"@mongodb-js/compass-collection": "^4.19.1",
4041
"@mongodb-js/compass-components": "^1.19.0",
4142
"@mongodb-js/compass-connections": "^1.20.1",
4243
"@mongodb-js/compass-database": "^3.19.1",
@@ -46,6 +47,7 @@
4647
"@mongodb-js/compass-instance": "^4.19.1",
4748
"@mongodb-js/compass-logging": "^1.2.6",
4849
"@mongodb-js/compass-saved-aggregations-queries": "^1.20.1",
50+
"@mongodb-js/compass-schema-validation": "^6.20.0",
4951
"@mongodb-js/compass-serverstats": "^16.19.1",
5052
"@mongodb-js/compass-settings": "^0.21.1",
5153
"@mongodb-js/compass-shell": "^3.19.1",
@@ -61,6 +63,7 @@
6163
"@mongodb-js/atlas-service": "^0.10.1",
6264
"@mongodb-js/compass-aggregations": "^9.20.0",
6365
"@mongodb-js/compass-app-stores": "^7.6.1",
66+
"@mongodb-js/compass-collection": "^4.19.1",
6467
"@mongodb-js/compass-components": "^1.19.0",
6568
"@mongodb-js/compass-connections": "^1.20.1",
6669
"@mongodb-js/compass-database": "^3.19.1",
@@ -70,6 +73,7 @@
7073
"@mongodb-js/compass-instance": "^4.19.1",
7174
"@mongodb-js/compass-logging": "^1.2.6",
7275
"@mongodb-js/compass-saved-aggregations-queries": "^1.20.1",
76+
"@mongodb-js/compass-schema-validation": "^6.20.0",
7377
"@mongodb-js/compass-serverstats": "^16.19.1",
7478
"@mongodb-js/compass-settings": "^0.21.1",
7579
"@mongodb-js/compass-shell": "^3.19.1",

packages/compass-home/src/components/workspace-content.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ import {
1111
CompassDatabasePlugin,
1212
DatabaseTabsProvider,
1313
} from '@mongodb-js/compass-database';
14+
import { CompassSchemaValidationPlugin } from '@mongodb-js/compass-schema-validation';
1415
import CompassSavedAggregationsQueriesPlugin from '@mongodb-js/compass-saved-aggregations-queries';
1516
import { InstanceTab as DatabasesTabPlugin } from '@mongodb-js/compass-databases-collections';
1617
import { InstanceTab as PerformanceTabPlugin } from '@mongodb-js/compass-serverstats';
1718
import type Namespace from '../types/namespace';
19+
import { CollectionTabsProvider } from '@mongodb-js/compass-collection';
1820

1921
const EmptyComponent: React.FunctionComponent = () => null;
2022

@@ -27,7 +29,11 @@ const WorkspaceContent: React.FunctionComponent<{ namespace: Namespace }> = ({
2729
useAppRegistryComponent('Collection.Workspace') ?? EmptyComponent;
2830

2931
if (namespace.collection) {
30-
return <Collection></Collection>;
32+
return (
33+
<CollectionTabsProvider tabs={[CompassSchemaValidationPlugin]}>
34+
<Collection />
35+
</CollectionTabsProvider>
36+
);
3137
}
3238

3339
if (namespace.database) {

0 commit comments

Comments
 (0)