/
index.ts
115 lines (94 loc) · 2.81 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import '../style/index.css';
import {
JupyterFrontEndPlugin,
ILabShell,
JupyterFrontEnd
} from '@jupyterlab/application';
import { IEditorTracker } from '@jupyterlab/fileeditor';
import { IDocumentManager } from '@jupyterlab/docmanager';
import { IFileBrowserFactory } from '@jupyterlab/filebrowser';
import { CommentingWidget } from './comments/commenting';
import { CommentingStates } from './comments/states';
import { CommentingDataProvider } from './comments/provider';
import { CommentingDataReceiver } from './comments/receiver';
import { CommentingIndicatorHandler } from './comments/indicator';
/**
* CommentingUI
*/
export let commentingUI: CommentingWidget;
/**
* Handles commenting overlay for viewers
*/
export let indicatorHandler: CommentingIndicatorHandler;
/**
* Data receiver / handler
*/
export let receiver: CommentingDataReceiver;
/**
* State holder for entire extension
*/
export const states: CommentingStates = new CommentingStates();
/**
* Data provider
*/
export const provider: CommentingDataProvider = new CommentingDataProvider(
states
);
/**
* Activate function for commentingUI
*/
export function activate(
app: JupyterFrontEnd,
labShell: ILabShell,
tracker: IEditorTracker,
docManager: IDocumentManager,
browserFactory: IFileBrowserFactory
) {
// Create receiver object
receiver = new CommentingDataReceiver(states, browserFactory);
// Create CommentingUI React widget
commentingUI = new CommentingWidget(provider, receiver);
commentingUI.id = 'jupyterlab-commenting:commentsUI';
commentingUI.title.iconClass = 'jp-ChatIcon jp-SideBar-tabIcon';
commentingUI.title.caption = 'Commenting';
// Add widget to the right area
labShell.add(commentingUI, 'right');
// Create CommentingIndicatorHandler
indicatorHandler = new CommentingIndicatorHandler(
app,
provider,
receiver,
labShell,
docManager
);
// Tracks active file open
labShell.currentChanged.connect((sender, args) => {
const widget = args.newValue;
if (widget === null) {
receiver.setTarget(undefined);
receiver.getAllComments();
} else {
const context = docManager.contextForWidget(widget);
if (!context) {
receiver.setTarget(undefined);
receiver.getAllComments();
return;
}
receiver.setTarget(context.path);
receiver.getAllComments();
}
});
// Called when new data is received from comments service
receiver.newDataReceived.connect(() => {
receiver.getAllComments();
});
}
// creates extension
const commentingExtension: JupyterFrontEndPlugin<void> = {
id: 'jupyterlab-commenting:commentsUI',
autoStart: true,
requires: [ILabShell, IEditorTracker, IDocumentManager, IFileBrowserFactory],
activate
};
const plugins: JupyterFrontEndPlugin<any>[] = [commentingExtension];
export default plugins;