@difizen/libro-jupyter 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/es/add-between-cell/add-between-cell.js +1 -1
  2. package/es/cell/jupyter-code-cell-view.d.ts +3 -1
  3. package/es/cell/jupyter-code-cell-view.d.ts.map +1 -1
  4. package/es/cell/jupyter-code-cell-view.js +12 -5
  5. package/es/command/command-contribution.d.ts.map +1 -1
  6. package/es/command/command-contribution.js +5 -5
  7. package/es/components/icons.js +1 -1
  8. package/es/contents/content-contribution.js +1 -1
  9. package/es/contents/save-content-contribution.d.ts +10 -0
  10. package/es/contents/save-content-contribution.d.ts.map +1 -0
  11. package/es/contents/save-content-contribution.js +110 -0
  12. package/es/file/file-create-modal.d.ts.map +1 -1
  13. package/es/file/file-create-modal.js +16 -5
  14. package/es/file/file-service.js +1 -1
  15. package/es/file/index.d.ts +1 -0
  16. package/es/file/index.d.ts.map +1 -1
  17. package/es/file/index.js +2 -1
  18. package/es/index.d.ts +1 -0
  19. package/es/index.d.ts.map +1 -1
  20. package/es/index.js +2 -1
  21. package/es/keybind-instructions/index.less +9 -9
  22. package/es/keybind-instructions/keybind-instructions-view.d.ts +2 -2
  23. package/es/keybind-instructions/keybind-instructions-view.d.ts.map +1 -1
  24. package/es/keybind-instructions/keybind-instructions-view.js +69 -63
  25. package/es/libro-jupyter-model.d.ts +2 -4
  26. package/es/libro-jupyter-model.d.ts.map +1 -1
  27. package/es/libro-jupyter-model.js +35 -120
  28. package/es/libro-jupyter-workspace.d.ts +18 -0
  29. package/es/libro-jupyter-workspace.d.ts.map +1 -0
  30. package/es/libro-jupyter-workspace.js +108 -0
  31. package/es/module.d.ts.map +1 -1
  32. package/es/module.js +5 -2
  33. package/es/output/libro-jupyter-outputarea.d.ts.map +1 -1
  34. package/es/output/libro-jupyter-outputarea.js +60 -56
  35. package/es/toolbar/save-file-error.d.ts.map +1 -1
  36. package/es/toolbar/save-file-error.js +20 -13
  37. package/es/widget/box/contribution.d.ts +10 -0
  38. package/es/widget/box/contribution.d.ts.map +1 -0
  39. package/es/widget/box/contribution.js +48 -0
  40. package/es/widget/box/index.d.ts +3 -0
  41. package/es/widget/box/index.d.ts.map +1 -0
  42. package/es/widget/box/index.js +2 -0
  43. package/es/widget/box/index.less +3 -0
  44. package/es/widget/box/view.d.ts +19 -0
  45. package/es/widget/box/view.d.ts.map +1 -0
  46. package/es/widget/box/view.js +114 -0
  47. package/es/widget/comm.d.ts +65 -0
  48. package/es/widget/comm.d.ts.map +1 -0
  49. package/es/widget/comm.js +153 -0
  50. package/es/widget/index.d.ts +10 -0
  51. package/es/widget/index.d.ts.map +1 -0
  52. package/es/widget/index.js +9 -0
  53. package/es/widget/index.less +7 -0
  54. package/es/widget/instance-progress/contribution.d.ts +10 -0
  55. package/es/widget/instance-progress/contribution.d.ts.map +1 -0
  56. package/es/widget/instance-progress/contribution.js +39 -0
  57. package/es/widget/instance-progress/index.d.ts +3 -0
  58. package/es/widget/instance-progress/index.d.ts.map +1 -0
  59. package/es/widget/instance-progress/index.js +2 -0
  60. package/es/widget/instance-progress/view.d.ts +30 -0
  61. package/es/widget/instance-progress/view.d.ts.map +1 -0
  62. package/es/widget/instance-progress/view.js +180 -0
  63. package/es/widget/libro-widgets.d.ts +84 -0
  64. package/es/widget/libro-widgets.d.ts.map +1 -0
  65. package/es/widget/libro-widgets.js +307 -0
  66. package/es/widget/module.d.ts +4 -0
  67. package/es/widget/module.d.ts.map +1 -0
  68. package/es/widget/module.js +38 -0
  69. package/es/widget/progress/contribution.d.ts +10 -0
  70. package/es/widget/progress/contribution.d.ts.map +1 -0
  71. package/es/widget/progress/contribution.js +39 -0
  72. package/es/widget/progress/index.d.ts +3 -0
  73. package/es/widget/progress/index.d.ts.map +1 -0
  74. package/es/widget/progress/index.js +2 -0
  75. package/es/widget/progress/progressBar.d.ts +15 -0
  76. package/es/widget/progress/progressBar.d.ts.map +1 -0
  77. package/es/widget/progress/progressBar.js +20 -0
  78. package/es/widget/progress/view.d.ts +19 -0
  79. package/es/widget/progress/view.d.ts.map +1 -0
  80. package/es/widget/progress/view.js +74 -0
  81. package/es/widget/protocol.d.ts +193 -0
  82. package/es/widget/protocol.d.ts.map +1 -0
  83. package/es/widget/protocol.js +33 -0
  84. package/es/widget/utils.d.ts +27 -0
  85. package/es/widget/utils.d.ts.map +1 -0
  86. package/es/widget/utils.js +59 -0
  87. package/es/widget/version.d.ts +3 -0
  88. package/es/widget/version.d.ts.map +1 -0
  89. package/es/widget/version.js +2 -0
  90. package/es/widget/widget-manager.d.ts +19 -0
  91. package/es/widget/widget-manager.d.ts.map +1 -0
  92. package/es/widget/widget-manager.js +77 -0
  93. package/es/widget/widget-render.d.ts +7 -0
  94. package/es/widget/widget-render.d.ts.map +1 -0
  95. package/es/widget/widget-render.js +46 -0
  96. package/es/widget/widget-rendermime-contribution.d.ts +16 -0
  97. package/es/widget/widget-rendermime-contribution.d.ts.map +1 -0
  98. package/es/widget/widget-rendermime-contribution.js +50 -0
  99. package/es/widget/widget-view-contribution.d.ts +10 -0
  100. package/es/widget/widget-view-contribution.d.ts.map +1 -0
  101. package/es/widget/widget-view-contribution.js +36 -0
  102. package/es/widget/widget-view.d.ts +71 -0
  103. package/es/widget/widget-view.d.ts.map +1 -0
  104. package/es/widget/widget-view.js +273 -0
  105. package/package.json +18 -18
  106. package/src/add-between-cell/add-between-cell.tsx +1 -1
  107. package/src/cell/jupyter-code-cell-view.tsx +14 -6
  108. package/src/command/command-contribution.ts +11 -10
  109. package/src/components/icons.tsx +1 -1
  110. package/src/contents/content-contribution.ts +1 -1
  111. package/src/contents/save-content-contribution.ts +67 -0
  112. package/src/file/file-create-modal.tsx +10 -1
  113. package/src/file/file-service.ts +1 -1
  114. package/src/file/index.ts +1 -0
  115. package/src/index.ts +1 -0
  116. package/src/keybind-instructions/index.less +9 -9
  117. package/src/keybind-instructions/keybind-instructions-view.tsx +72 -62
  118. package/src/libro-jupyter-model.ts +1 -69
  119. package/src/libro-jupyter-workspace.ts +49 -0
  120. package/src/module.ts +6 -0
  121. package/src/output/libro-jupyter-outputarea.tsx +56 -49
  122. package/src/toolbar/save-file-error.tsx +25 -15
  123. package/src/widget/box/contribution.ts +29 -0
  124. package/src/widget/box/index.less +3 -0
  125. package/src/widget/box/index.ts +2 -0
  126. package/src/widget/box/view.tsx +112 -0
  127. package/src/widget/comm.ts +152 -0
  128. package/src/widget/index.less +7 -0
  129. package/src/widget/index.ts +9 -0
  130. package/src/widget/instance-progress/contribution.ts +20 -0
  131. package/src/widget/instance-progress/index.ts +2 -0
  132. package/src/widget/instance-progress/view.tsx +155 -0
  133. package/src/widget/libro-widgets.ts +223 -0
  134. package/src/widget/module.ts +73 -0
  135. package/src/widget/progress/contribution.ts +24 -0
  136. package/src/widget/progress/index.ts +2 -0
  137. package/src/widget/progress/progressBar.tsx +29 -0
  138. package/src/widget/progress/view.tsx +70 -0
  139. package/src/widget/protocol.ts +255 -0
  140. package/src/widget/utils.ts +67 -0
  141. package/src/widget/version.ts +2 -0
  142. package/src/widget/widget-manager.ts +45 -0
  143. package/src/widget/widget-render.tsx +52 -0
  144. package/src/widget/widget-rendermime-contribution.ts +36 -0
  145. package/src/widget/widget-view-contribution.ts +14 -0
  146. package/src/widget/widget-view.tsx +259 -0
@@ -0,0 +1,259 @@
1
+ import type { JSONObject, JSONValue, IOutput, OutputType } from '@difizen/libro-common';
2
+ import type { CellView, LibroExecutableCellView } from '@difizen/libro-core';
3
+ import { ExecutableCellView } from '@difizen/libro-core';
4
+ import { LibroContextKey } from '@difizen/libro-core';
5
+ import type { KernelMessage } from '@difizen/libro-kernel';
6
+ import {
7
+ inject,
8
+ transient,
9
+ ViewOption,
10
+ view,
11
+ BaseView,
12
+ prop,
13
+ watch,
14
+ } from '@difizen/mana-app';
15
+ import type { ViewComponent, Disposable } from '@difizen/mana-app';
16
+ import { forwardRef } from 'react';
17
+
18
+ import { LibroJupyterModel } from '../libro-jupyter-model.js';
19
+
20
+ import { defaultWidgetState } from './protocol.js';
21
+ import type {
22
+ Dict,
23
+ IWidgets,
24
+ IWidgetView,
25
+ IClassicComm,
26
+ ICallbacks,
27
+ IWidgetViewProps,
28
+ WidgetState,
29
+ } from './protocol.js';
30
+ import { LibroWidgetManager } from './widget-manager.js';
31
+
32
+ export const LibroWidgetComponent = forwardRef<HTMLDivElement>(
33
+ function LibroWidgetComponent() {
34
+ return <></>;
35
+ },
36
+ );
37
+
38
+ @transient()
39
+ @view('libro-widget-view')
40
+ export class WidgetView extends BaseView implements IWidgetView {
41
+ override view: ViewComponent = LibroWidgetComponent;
42
+ libroContextKey: LibroContextKey;
43
+ widgetsId: string;
44
+ protected _msgHook: (msg: KernelMessage.IIOPubMessage) => boolean;
45
+
46
+ @inject(LibroWidgetManager) libroWidgetManager: LibroWidgetManager;
47
+
48
+ @prop()
49
+ state: JSONObject & WidgetState = defaultWidgetState;
50
+
51
+ cell?: LibroExecutableCellView;
52
+
53
+ get outputs() {
54
+ if (this.cell) {
55
+ return this.cell.outputArea;
56
+ }
57
+ return undefined;
58
+ }
59
+
60
+ disableCommandMode = true;
61
+
62
+ toDisposeOnMsgChanged?: Disposable;
63
+
64
+ constructor(
65
+ @inject(ViewOption) props: IWidgetViewProps,
66
+ @inject(LibroContextKey) libroContextKey: LibroContextKey,
67
+ ) {
68
+ super();
69
+ this.widgetsId = props.widgetsId;
70
+ const attributes = props.attributes;
71
+ this.model_module = attributes._model_module;
72
+ this.model_name = attributes._model_name;
73
+ this.model_module_version = attributes._model_module_version;
74
+ this.view_module = attributes._view_module;
75
+ this.view_name = attributes._view_name;
76
+ this.view_module_version = attributes._view_module_version;
77
+ this.view_count = attributes._view_count;
78
+
79
+ this._msgHook = (msg: KernelMessage.IIOPubMessage): boolean => {
80
+ this.addFromMessage(msg);
81
+ return false;
82
+ };
83
+
84
+ // Attributes should be initialized here, since user initialization may depend on it
85
+ const comm = props.options.comm;
86
+ if (comm) {
87
+ // Remember comm associated with the model.
88
+ this.comm = comm;
89
+
90
+ // Hook comm messages up to model.
91
+ comm.onClose(this.handleCommClosed.bind(this));
92
+ comm.onMsg(this.handleCommMsg.bind(this));
93
+ } else {
94
+ this.isCommClosed = false;
95
+ }
96
+ this.model_id = props.options.model_id;
97
+
98
+ this.state_change = Promise.resolve();
99
+ this.setState(attributes);
100
+ this.libroContextKey = libroContextKey;
101
+ }
102
+
103
+ setCell(cell: CellView) {
104
+ if (ExecutableCellView.is(cell)) {
105
+ this.cell = cell as LibroExecutableCellView;
106
+ if (this.cell) {
107
+ this.cell.parentReady
108
+ .then(() => {
109
+ const notebookModel = this.cell?.parent.model;
110
+ if (notebookModel instanceof LibroJupyterModel) {
111
+ watch(notebookModel, 'kernelConnection', this.handleKernelChanged);
112
+ }
113
+ return;
114
+ })
115
+ .catch(console.error);
116
+ }
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Register a new kernel
122
+ */
123
+ handleKernelChanged = (): void => {
124
+ this.setState({ msg_id: undefined });
125
+ };
126
+
127
+ /**
128
+ * Reset the message id.
129
+ */
130
+ resetMsgId(): void {
131
+ this.toDisposeOnMsgChanged?.dispose();
132
+ const notebookModel = this.cell?.parent?.model;
133
+
134
+ if (notebookModel instanceof LibroJupyterModel) {
135
+ const kernel = notebookModel.kernelConnection;
136
+ if (kernel && this.state['msg_id']) {
137
+ this.toDisposeOnMsgChanged = kernel.registerMessageHook(
138
+ this.state['msg_id'],
139
+ this._msgHook,
140
+ );
141
+ }
142
+ }
143
+ }
144
+
145
+ addFromMessage(msg: KernelMessage.IIOPubMessage) {
146
+ const msgType = msg.header.msg_type;
147
+ switch (msgType) {
148
+ case 'execute_result':
149
+ case 'display_data':
150
+ case 'stream':
151
+ case 'error': {
152
+ const model = msg.content as IOutput;
153
+ model.output_type = msgType as OutputType;
154
+ this.outputs?.add(model);
155
+ break;
156
+ }
157
+ case 'clear_output':
158
+ this.clearOutput((msg as KernelMessage.IClearOutputMsg).content.wait);
159
+ break;
160
+ default:
161
+ break;
162
+ }
163
+ }
164
+
165
+ clearOutput(wait = false): void {
166
+ this.outputs?.clear(wait);
167
+ }
168
+
169
+ override onViewMount() {
170
+ this.widgets = this.libroWidgetManager.getWidgets(this.widgetsId)!;
171
+
172
+ if (this.container && this.container.current && this.disableCommandMode) {
173
+ this.container.current.addEventListener('focusin', () => {
174
+ this.libroContextKey.disableCommandMode();
175
+ });
176
+ this.container.current.addEventListener('blur', (e) => {
177
+ if (this.container?.current?.contains(e.relatedTarget as Node)) {
178
+ this.libroContextKey.disableCommandMode();
179
+ } else {
180
+ this.libroContextKey.enableCommandMode();
181
+ }
182
+ });
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Handle incoming comm msg.
188
+ */
189
+ handleCommMsg(msg: KernelMessage.ICommMsgMsg): Promise<void> {
190
+ const data = msg.content.data as any;
191
+ const method = data.method;
192
+ switch (method) {
193
+ case 'update':
194
+ case 'echo_update':
195
+ this.setState(data.state);
196
+ }
197
+ return Promise.resolve();
198
+ }
199
+
200
+ handleCommClosed = () => {
201
+ this.isCommClosed = true;
202
+ };
203
+ /**
204
+ * Handle when a widget is updated from the backend.
205
+ *
206
+ * This function is meant for internal use only. Values set here will not be propagated on a sync.
207
+ */
208
+ setState(state: Dict<any>): void {
209
+ for (const key in state) {
210
+ const oldMsgId = this.state['msg_id'];
211
+ this.state[key] = state[key];
212
+ if (key === 'msg_id' && oldMsgId !== state['msg_id']) {
213
+ this.resetMsgId();
214
+ }
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Serialize the model. See the deserialization function at the top of this file
220
+ * and the kernel-side serializer/deserializer.
221
+ */
222
+ toJSON(): string {
223
+ return this.toModelKey();
224
+ }
225
+
226
+ toModelKey(): string {
227
+ return `IPY_MODEL_${this.model_id}`;
228
+ }
229
+
230
+ /**
231
+ * Send a custom msg over the comm.
232
+ */
233
+ send = (
234
+ data: JSONValue,
235
+ callbacks?: ICallbacks,
236
+ buffers?: ArrayBuffer[] | ArrayBufferView[],
237
+ ) => {
238
+ if (this.comm !== undefined) {
239
+ return this.comm.send(data, callbacks, {}, buffers);
240
+ }
241
+ return undefined;
242
+ };
243
+
244
+ comm: IClassicComm;
245
+ @prop() widgets?: IWidgets;
246
+ model_id: string;
247
+ state_change: Promise<any>;
248
+ name: string;
249
+ module: string;
250
+ isCommClosed = false;
251
+
252
+ model_module: string;
253
+ model_name: string;
254
+ model_module_version: string;
255
+ view_module: string;
256
+ view_name: string | null;
257
+ view_module_version: string;
258
+ view_count: number | null;
259
+ }