jupyter-collaboration-ui 2.2.0b0__tar.gz → 2.2.1__tar.gz
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.
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/PKG-INFO +1 -1
- jupyter_collaboration_ui-2.2.1/jupyter_collaboration_ui/_version.py +1 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/package.json +5 -5
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/schemas/@jupyter/collaboration-extension/package.json.orig +4 -4
- jupyter_collaboration_ui-2.2.1/jupyter_collaboration_ui/labextension/static/240.dd38b925e1faeb907a84.js +1 -0
- jupyter_collaboration_ui-2.2.0b0/jupyter_collaboration_ui/labextension/static/393.524b2f698076f0d04861.js → jupyter_collaboration_ui-2.2.1/jupyter_collaboration_ui/labextension/static/393.4d70605d766485df5d02.js +1 -1
- jupyter_collaboration_ui-2.2.1/jupyter_collaboration_ui/labextension/static/842.3ee3a54baf126527c584.js +1 -0
- jupyter_collaboration_ui-2.2.1/jupyter_collaboration_ui/labextension/static/remoteEntry.a5c414fde04ba50d93a5.js +1 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/static/third-party-licenses.json +3 -3
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/package.json +1 -1
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/userinfopanel.tsx +14 -3
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/package.json +4 -4
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/src/collaboration.ts +3 -1
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaborative-drive/package.json +1 -1
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/package.json +2 -2
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/TimelineSlider.tsx +6 -1
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/__tests__/forkManager.spec.ts +10 -5
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/component.tsx +12 -5
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/forkManager.ts +15 -4
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/requests.ts +12 -8
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/ydrive.ts +3 -8
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/yprovider.ts +43 -9
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/package.json +3 -3
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/src/filebrowser.ts +2 -1
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/src/forkManager.ts +5 -1
- jupyter_collaboration_ui-2.2.0b0/jupyter_collaboration_ui/_version.py +0 -1
- jupyter_collaboration_ui-2.2.0b0/jupyter_collaboration_ui/labextension/static/240.6633f3541859f6313c7e.js +0 -1
- jupyter_collaboration_ui-2.2.0b0/jupyter_collaboration_ui/labextension/static/842.571d21bfa34b61c76b78.js +0 -1
- jupyter_collaboration_ui-2.2.0b0/jupyter_collaboration_ui/labextension/static/remoteEntry.9e3b8f33e2224acbe012.js +0 -1
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/.gitignore +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/LICENSE +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/README.md +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/install.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/__init__.py +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/schemas/@jupyter/collaboration-extension/shared-link.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/schemas/@jupyter/collaboration-extension/user-menu-bar.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/static/422.c33fd4bf2f8b13b1f430.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/static/444.d6f3cc1c6d4b374efa63.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/static/784.586f70cab201cb43c954.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/static/944.27191c0195c19b79d6b0.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/static/952.8934cdeb03f9bd1e666f.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/jupyter_collaboration_ui/labextension/static/style.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/README.md +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/collaboratorspanel.tsx +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/components.tsx +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/cursors.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/index.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/menu.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/sharedlink.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/tokens.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/src/users-item.tsx +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/style/base.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/style/index.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/style/index.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/style/menu.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/style/sharedlink.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/style/sidepanel.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/style/users-item.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration/tsconfig.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/README.md +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/schema/shared-link.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/schema/user-menu-bar.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/src/index.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/src/sharedlink.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/style/index.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/style/index.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaboration-extension/tsconfig.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaborative-drive/src/index.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaborative-drive/src/tokens.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/collaborative-drive/tsconfig.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/babel.config.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/jest.config.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/__tests__/yprovider.spec.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/awareness.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/index.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/notebookCellExecutor.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/src/tokens.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/style/base.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/style/index.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/style/index.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/style/slider.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/tsconfig.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider/tsconfig.test.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/README.md +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/src/executor.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/src/index.ts +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/style/index.css +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/style/index.js +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/packages/docprovider-extension/tsconfig.json +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/pyproject.toml +0 -0
- {jupyter_collaboration_ui-2.2.0b0 → jupyter_collaboration_ui-2.2.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jupyter-collaboration-ui
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.1
|
|
4
4
|
Summary: JupyterLab/Jupyter Notebook 7+ extension providing user interface integration for real time collaboration
|
|
5
5
|
Project-URL: Documentation, https://jupyterlab-realtime-collaboration.readthedocs.io/
|
|
6
6
|
Project-URL: Repository, https://github.com/jupyterlab/jupyter-collaboration
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.2.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupyter/collaboration-extension",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.1",
|
|
4
4
|
"description": "JupyterLab - Real-Time Collaboration Extension",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jupyter",
|
|
@@ -53,9 +53,9 @@
|
|
|
53
53
|
"watch:labextension": "jupyter labextension watch ."
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@jupyter/collaboration": "^4.2.
|
|
57
|
-
"@jupyter/collaborative-drive": "^4.2.
|
|
58
|
-
"@jupyter/docprovider": "^4.2.
|
|
56
|
+
"@jupyter/collaboration": "^4.2.1",
|
|
57
|
+
"@jupyter/collaborative-drive": "^4.2.1",
|
|
58
|
+
"@jupyter/docprovider": "^4.2.1",
|
|
59
59
|
"@jupyter/ydoc": "^2.1.3 || ^3.0.0",
|
|
60
60
|
"@jupyterlab/application": "^4.5.0",
|
|
61
61
|
"@jupyterlab/apputils": "^4.5.0",
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
}
|
|
126
126
|
},
|
|
127
127
|
"_build": {
|
|
128
|
-
"load": "static/remoteEntry.
|
|
128
|
+
"load": "static/remoteEntry.a5c414fde04ba50d93a5.js",
|
|
129
129
|
"extension": "./extension",
|
|
130
130
|
"style": "./style"
|
|
131
131
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupyter/collaboration-extension",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.1",
|
|
4
4
|
"description": "JupyterLab - Real-Time Collaboration Extension",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jupyter",
|
|
@@ -53,9 +53,9 @@
|
|
|
53
53
|
"watch:labextension": "jupyter labextension watch ."
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@jupyter/collaboration": "^4.2.
|
|
57
|
-
"@jupyter/collaborative-drive": "^4.2.
|
|
58
|
-
"@jupyter/docprovider": "^4.2.
|
|
56
|
+
"@jupyter/collaboration": "^4.2.1",
|
|
57
|
+
"@jupyter/collaborative-drive": "^4.2.1",
|
|
58
|
+
"@jupyter/docprovider": "^4.2.1",
|
|
59
59
|
"@jupyter/ydoc": "^2.1.3 || ^3.0.0",
|
|
60
60
|
"@jupyterlab/application": "^4.5.0",
|
|
61
61
|
"@jupyterlab/apputils": "^4.5.0",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_jupyter_collaboration_extension=self.webpackChunk_jupyter_collaboration_extension||[]).push([[240],{5068:(e,t,n)=>{n.d(t,{A:()=>a});var r=n(6758),o=n.n(r),s=n(935),i=n.n(s)()(o());i.push([e.id,"/* -----------------------------------------------------------------------------\n| Copyright (c) Jupyter Development Team.\n| Distributed under the terms of the Modified BSD License.\n|---------------------------------------------------------------------------- */\n\n.jp-timelineSliderWrapper .jp-sliderContainer{\n display: flex;\n align-items: center;\n}\n\n.jp-Slider {\n height: 4.5px\n}\n\n#jp-slider-status-bar {\n display: flex;\n}\n\n.jp-timestampDisplay {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 6px;\n}\n\n.jp-restoreBtnContainer {\n width: 192px;\n}\n\n.jp-ToolbarButtonComponent.jp-restoreBtn {\n cursor: pointer;\n color: var(--jp-layout-color2);\n width: 100%;\n background: var(--jp-accept-color-normal)\n}\n",""]);const a=i},935:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,r,o,s){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var a=0;a<this.length;a++){var c=this[a][0];null!=c&&(i[c]=!0)}for(var l=0;l<e.length;l++){var d=[].concat(e[l]);r&&i[d[0]]||(void 0!==s&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=s),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),o&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=o):d[4]="".concat(o)),t.push(d))}},t}},6758:e=>{e.exports=function(e){return e[1]}},2591:e=>{var t=[];function n(e){for(var n=-1,r=0;r<t.length;r++)if(t[r].identifier===e){n=r;break}return n}function r(e,r){for(var s={},i=[],a=0;a<e.length;a++){var c=e[a],l=r.base?c[0]+r.base:c[0],d=s[l]||0,h="".concat(l," ").concat(d);s[l]=d+1;var u=n(h),p={css:c[1],media:c[2],sourceMap:c[3],supports:c[4],layer:c[5]};if(-1!==u)t[u].references++,t[u].updater(p);else{var v=o(p,r);r.byIndex=a,t.splice(a,0,{identifier:h,updater:v,references:1})}i.push(h)}return i}function o(e,t){var n=t.domAPI(t);return n.update(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;n.update(e=t)}else n.remove()}}e.exports=function(e,o){var s=r(e=e||[],o=o||{});return function(e){e=e||[];for(var i=0;i<s.length;i++){var a=n(s[i]);t[a].references--}for(var c=r(e,o),l=0;l<s.length;l++){var d=n(s[l]);0===t[d].references&&(t[d].updater(),t.splice(d,1))}s=c}}},8128:e=>{var t={};e.exports=function(e,n){var r=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},3051:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},855:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},1740:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var o=void 0!==n.layer;o&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,o&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var s=n.sourceMap;s&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},3656:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},6240:(e,t,n)=>{n.r(t),n.d(t,{ForkManager:()=>z,IForkManagerToken:()=>q,JUPYTER_COLLABORATION_FORK_EVENTS_URI:()=>K,NotebookCellServerExecutor:()=>l,ROOM_FORK_URL:()=>p,RtcContentProvider:()=>C,TimelineWidget:()=>V,WebSocketAwarenessProvider:()=>o,WebSocketProvider:()=>S,requestAPI:()=>v,requestDocSession:()=>m,requestDocumentTimeline:()=>g,requestUndoRedo:()=>f});var r=n(3560);class o extends r.WebsocketProvider{constructor(e){super(e.url,e.roomID,e.awareness.doc,{awareness:e.awareness}),this._isDisposed=!1,this._awareness=e.awareness,this._user=e.user,this._user.ready.then((()=>this._onUserChanged(this._user))).catch((e=>console.error(e))),this._user.userChanged.connect(this._onUserChanged,this)}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._user.userChanged.disconnect(this._onUserChanged,this),this._isDisposed=!0,this.destroy())}_onUserChanged(e){this._awareness.setLocalStateField("user",e.identity)}}var s=n(5285),i=n(4526),a=n(1125),c=n(769);class l{constructor(e){var t;this._serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:a.ServerConnection.makeSettings()}async runCell({cell:e,notebook:t,notebookConfig:n,onCellExecuted:r,onCellExecutionScheduled:o,sessionContext:l,sessionDialogs:d,translator:h}){var u,p,v;const m=(h=null!=h?h:c.nullTranslator).load("jupyterlab");switch(e.model.type){case"markdown":e.rendered=!0,e.inputHidden=!1,r({cell:e,success:!0});break;case"code":if(l){if(l.isTerminating){await(0,s.showDialog)({title:m.__("Kernel Terminating"),body:m.__("The kernel for %1 appears to be terminating. You can not run any cell for now.",null===(u=l.session)||void 0===u?void 0:u.path),buttons:[s.Dialog.okButton()]});break}if(l.pendingInput)return await(0,s.showDialog)({title:m.__("Cell not executed due to pending input"),body:m.__("The cell has not been executed to avoid kernel deadlock as there is another pending input! Submit your pending input and try again."),buttons:[s.Dialog.okButton()]}),!1;if(l.hasNoKernel&&await l.startKernel()&&d&&await d.selectKernel(l),l.hasNoKernel)return e.model.sharedModel.transact((()=>{e.model.clearExecution()})),!0;const n=null===(v=null===(p=null==l?void 0:l.session)||void 0===p?void 0:p.kernel)||void 0===v?void 0:v.id,c=i.URLExt.join(this._serverSettings.baseUrl,`api/kernels/${n}/execute`),h=e.model.sharedModel.getId(),g=t.sharedModel.getState("document_id"),f={method:"POST",body:JSON.stringify({cell_id:h,document_id:g})};o({cell:e});let _=!1;try{_=(await a.ServerConnection.makeRequest(c,f,this._serverSettings)).ok}catch(t){if(r({cell:e,success:!1}),e.isDisposed)return!1;throw t}return r({cell:e,success:_}),!0}e.model.sharedModel.transact((()=>{e.model.clearExecution()}),!1)}return Promise.resolve(!0)}}const d="api/collaboration/session",h="api/collaboration/undo_redo",u="api/collaboration/timeline",p="api/collaboration/fork";async function v(e="",t={},n){const r=null!=n?n:a.ServerConnection.makeSettings(),o=i.URLExt.join(r.baseUrl,e);let s;try{s=await a.ServerConnection.makeRequest(o,t,r)}catch(e){throw new a.ServerConnection.NetworkError(e)}let c=await s.text();if(c.length>0)try{c=JSON.parse(c)}catch(e){console.error("Not a JSON response body.",s)}if(!s.ok)throw new a.ServerConnection.ResponseError(s,c.message||c);return c}async function m(e,t,n,r){const o=null!=r?r:a.ServerConnection.makeSettings(),s=i.URLExt.join(o.baseUrl,d,encodeURIComponent(n)),c={method:"PUT",body:JSON.stringify({format:e,type:t})};let l;try{l=await a.ServerConnection.makeRequest(s,c,o)}catch(e){throw new a.ServerConnection.NetworkError(e)}let h=await l.text();if(h.length>0)try{h=JSON.parse(h)}catch(e){console.log("Not a JSON response body.",l)}if(!l.ok)throw new a.ServerConnection.ResponseError(l,h.message||h);return h}async function g(e,t,n,r){const o=null!=r?r:a.ServerConnection.makeSettings();let s=i.URLExt.join(o.baseUrl,u,n);s=s.concat(`?format=${e}&&type=${t}`);const c={method:"GET"};let l;try{l=await a.ServerConnection.makeRequest(s,c,o)}catch(e){throw new a.ServerConnection.NetworkError(e)}return l}async function f(e,t,n,r,o){const s=null!=o?o:a.ServerConnection.makeSettings();let c=i.URLExt.join(s.baseUrl,h,encodeURIComponent(e));c=c.concat(`?action=${t}&&steps=${n}&&forkRoom=${r}`);const l={method:"PUT"};let d;try{d=await a.ServerConnection.makeRequest(c,l,s)}catch(e){throw new a.ServerConnection.NetworkError(e)}let u=await d.text();if(u.length>0)try{u=JSON.parse(u)}catch(e){console.log("Not a JSON response body.",d)}if(!d.ok)throw new a.ServerConnection.ResponseError(d,u.message||u);return u}var _=n(7262),y=n(4602);class S{constructor(e){var t;this._onConnectionClosed=e=>{1003===e.code&&(console.error("Document provider closed:",e.reason),(0,s.showErrorMessage)(this._trans.__("Document session error"),e.reason,[s.Dialog.okButton()]),this._sharedModel.dispose())},this._onSync=e=>{e&&(this._yWebsocketProvider&&(this._yWebsocketProvider.off("sync",this._onSync),this._sharedModel.ydoc.getMap("state").set("document_id",this._yWebsocketProvider.roomname)),this._ready.resolve())},this._ready=new _.PromiseDelegate,this._isDisposed=!1,this._path=e.path,this._contentType=e.contentType,this._format=e.format,this._customServerUrl=e.url,this._sharedModel=e.model,this._awareness=e.model.awareness,this._yWebsocketProvider=null,this._serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:a.ServerConnection.makeSettings(),this._trans=e.translator;const n=e.user;n.ready.then((()=>{this._onUserChanged(n)})).catch((e=>console.error(e))),n.userChanged.connect(this._onUserChanged,this),this._connect().catch((e=>console.warn(e)))}get isDisposed(){return this._isDisposed}get ready(){return this._ready.promise}get contentType(){return this._contentType}get format(){return this._format}dispose(){var e,t,n;this.isDisposed||(this._isDisposed=!0,null===(e=this._yWebsocketProvider)||void 0===e||e.off("connection-close",this._onConnectionClosed),null===(t=this._yWebsocketProvider)||void 0===t||t.off("sync",this._onSync),null===(n=this._yWebsocketProvider)||void 0===n||n.destroy(),this._disconnect(),y.Signal.clearData(this))}async reconnect(){this._disconnect(),this._connect()}get _serverUrl(){var e;return null!==(e=this._customServerUrl)&&void 0!==e?e:i.URLExt.join(this._serverSettings.wsUrl,"api/collaboration/room")}async _connect(){const e=await m(this._format,this._contentType,this._path,this._serverSettings),t=this._serverSettings.token,n={sessionId:e.sessionId};this._serverSettings.appendToken&&""!==t&&(n.token=t),this._yWebsocketProvider=new r.WebsocketProvider(this._serverUrl,`${e.format}:${e.type}:${e.fileId}`,this._sharedModel.ydoc,{disableBc:!0,params:n,awareness:this._awareness,WebSocketPolyfill:this._serverSettings.WebSocket}),this._yWebsocketProvider.on("sync",this._onSync),this._yWebsocketProvider.on("connection-close",this._onConnectionClosed)}async connectToForkDoc(e,t){const n=this._serverSettings.token,o={sessionId:t};this._serverSettings.appendToken&&""!==n&&(o.token=n),this._disconnect(),this._yWebsocketProvider=new r.WebsocketProvider(this._serverUrl,e,this._sharedModel.ydoc,{disableBc:!0,params:o,awareness:this._awareness,WebSocketPolyfill:this._serverSettings.WebSocket})}get wsProvider(){return this._yWebsocketProvider}_disconnect(){var e,t,n;null===(e=this._yWebsocketProvider)||void 0===e||e.off("connection-close",this._onConnectionClosed),null===(t=this._yWebsocketProvider)||void 0===t||t.off("sync",this._onSync),null===(n=this._yWebsocketProvider)||void 0===n||n.destroy(),this._yWebsocketProvider=null}_onUserChanged(e){this._awareness.setLocalStateField("user",e.identity)}}var w=n(3721),k=n(6214);const b="true"===i.PageConfig.getOption("disableRTC");class C{constructor(e){this._onCreate=(e,t)=>{var n,r,o,s,i,a,c;if("string"!=typeof e.format)return;const l=null===(o=null===(r=null===(n=this._docmanagerSettings)||void 0===n?void 0:n.composite)||void 0===r?void 0:r.autosave)||void 0===o||o;t.awareness.setLocalStateField("autosave",l),null===(s=this._docmanagerSettings)||void 0===s||s.changed.connect((()=>{var e,n,r;const o=null===(r=null===(n=null===(e=this._docmanagerSettings)||void 0===e?void 0:e.composite)||void 0===n?void 0:n.autosave)||void 0===r||r;t.awareness.setLocalStateField("autosave",o)}));try{const n=new S({path:e.path,format:e.format,contentType:e.contentType,model:t,user:this._user,translator:this._trans,serverSettings:this._serverSettings}),r=((null===(i=this._globalAwareness)||void 0===i?void 0:i.getLocalState())||{}).documents||[];r.includes(e.path)||(r.push(e.path),null===(a=this._globalAwareness)||void 0===a||a.setLocalStateField("documents",r));let o=e.path,s=`${e.format}:${e.contentType}:${o}`;this._providers.set(s,n);const l=t=>{var n,r;const i=t.oldValue,a=t.newValue;if(!i||!a)return void console.debug("New or old path not given",t);const c=`${e.format}:${e.contentType}:${i}`;if(c!==s)return void console.error("The computed old provider key is different from the current key");const l=`${e.format}:${e.contentType}:${a}`,d=this._providers.get(c);if(!d)return void console.warn(`Could not find a provider to update after rename ${c}, ${l}`);this._providers.set(l,d),this._providers.delete(c),s=l,o=a;const h=((null===(n=this._globalAwareness)||void 0===n?void 0:n.getLocalState())||{}).documents||[],u=h.indexOf(i);h.includes(i)&&!h.includes(a)&&(h.splice(u,1),h.push(a),null===(r=this._globalAwareness)||void 0===r||r.setLocalStateField("documents",h))},d=(e,t)=>{var n,r;if("rename"!==t.type)return;const s=null===(n=t.oldValue)||void 0===n?void 0:n.path,i=null===(r=t.newValue)||void 0===r?void 0:r.path;s===o&&l({oldValue:s,newValue:i,name:"path"})};null===(c=this._driveFileChanged)||void 0===c||c.connect(d),t.changed.connect((async(n,r)=>{var o;if(!r.stateChange)return;const s=r.stateChange.filter((e=>"path"===e.name));for(const e of s)l(e);const i=r.stateChange.filter((e=>"hash"===e.name));if(0===i.length)return;i.length>1&&console.error("Unexpected multiple changes to hash value in a single transaction");const a=i[0],c=null!==(o=t.state.path)&&void 0!==o?o:e.path,d=await this.get(c,{content:!1});this._providerFileChanged.emit({type:"save",newValue:{...d,hash:a.newValue},oldValue:{hash:a.oldValue}})})),t.disposed.connect((()=>{var e,t,n;const r=this._providers.get(s);r&&(r.dispose(),this._providers.delete(s));const i=((null===(e=this._globalAwareness)||void 0===e?void 0:e.getLocalState())||{}).documents||[],a=i.indexOf(o);a>-1&&i.splice(a,1),null===(t=this._globalAwareness)||void 0===t||t.setLocalStateField("documents",i),null===(n=this._driveFileChanged)||void 0===n||n.disconnect(d)}))}catch(t){console.error(`Failed to open websocket connection for ${e.path}.\n:${t}`)}},this._saveCounter=0,this._providerFileChanged=new y.Signal(this),this._user=e.user,this._trans=e.trans,this._globalAwareness=e.globalAwareness,this._serverSettings=e.serverSettings,this._currentDrive=e.currentDrive,this.sharedModelFactory=new T(this._onCreate),this._providers=new Map,this._docmanagerSettings=e.docmanagerSettings,this._driveFileChanged=e.fileChanged}get providers(){return this._providers}async get(e,t){if(t&&t.format&&t.type){const n=`${t.format}:${t.type}:${e}`,r=this._providers.get(n);if(r){const[n]=await Promise.all([this._currentDrive.get(e,{...t,content:!1,contentProviderId:void 0}),r.ready]);return{...n,format:t.format}}}return this._currentDrive.get(e,{...t,contentProviderId:void 0})}async save(e,t={}){var n;if(t.format&&t.type){const r=`${t.format}:${t.type}:${e}`,o=this._providers.get(r),s=++this._saveCounter;if(o){const r=null===(n=o.wsProvider)||void 0===n?void 0:n.ws;if(r){const e=new _.PromiseDelegate,t=t=>{const n=new Uint8Array(t.data),r=w.$C(n);try{if(2!==w.cw(r))return}catch(e){return}const o=w.t3(r);let i=null;try{i=JSON.parse(o)}catch(e){console.debug("The raw reply received was not a JSON reply")}i&&"save"===i.type&&i.responseTo===s&&("success"===i.status?e.resolve():"failed"===i.status?e.reject("Saving failed"):"skipped"===i.status?e.reject("Saving already in progress"):e.reject("Unrecognised save reply status"))};r.addEventListener("message",t);const n=k.xv();k.zd(n,2),k.Qj(n,"save"),k.zd(n,s);const o=k.Fo(n);r.send(o),await e.promise,r.removeEventListener("message",t)}const i={type:t.type,format:t.format,content:!1};return this.get(e,i)}console.warn(`Could not find a provider for ${e}, falling back to REST API save`)}return this._currentDrive.save(e,{...t,contentProviderId:void 0})}get fileChanged(){return this._providerFileChanged}}class T{constructor(e){this._onCreate=e,this.collaborative=!b,this.documentFactories=new Map}registerDocumentFactory(e,t){if(this.documentFactories.has(e))throw new Error(`The content type ${e} already exists`);this.documentFactories.set(e,t)}createNew(e){if("string"==typeof e.format){if(this.collaborative&&e.collaborative&&this.documentFactories.has(e.contentType)){const t=this.documentFactories.get(e.contentType)(e);return this._onCreate(e,t),t}}else console.warn(`Only defined format are supported; got ${e.format}.`)}}var E=n(3345),x=n.n(E),U=n(2591),R=n.n(U),$=n(1740),D=n.n($),P=n(8128),j=n.n(P),N=n(855),L=n.n(N),I=n(3051),F=n.n(I),M=n(3656),A=n.n(M),W=n(5068),O={};O.styleTagTransform=A(),O.setAttributes=L(),O.insert=j().bind(null,"head"),O.domAPI=D(),O.insertStyleElement=F(),R()(W.A,O),W.A&&W.A.locals&&W.A.locals;var J=n(3391);const B=({apiURL:e,provider:t,contentType:n,format:r,documentTimelineUrl:o,serverSettings:i})=>{const[a,c]=(0,E.useState)({roomId:"",timestamps:[],forkRoom:"",sessionId:""}),[l,d]=(0,E.useState)(a.timestamps.length-1),[h,u]=(0,E.useState)(!1),[p,v]=(0,E.useState)(!1),_=(0,E.useRef)(!0),y=(0,E.useRef)(!0),S=(0,E.useRef)(null);function w(e){try{const t=new URL(e).pathname,n=t.lastIndexOf(o);if(-1===n)throw new Error(`API segment "${o}" not found in URL.`);return t.slice(n+o.length)}catch(e){return console.error("Invalid URL or unable to extract filename:",e),""}}return x().createElement("div",{className:"jp-sliderContainer"},x().createElement("div",{onClick:()=>{!async function(o){try{if(_.current){const a=await g(r,n,o,i);if(!a.ok)throw 404===a.status?new Error("Not found"):503===a.status?new Error("WebSocket closed"):new Error(`Failed to fetch data: ${a.statusText}`);const l=await a.text();let h={roomId:"",timestamps:[],forkRoom:"",sessionId:""};return l&&(s.Notification.warning("Document is now in read-only mode. Changes will not be saved.",{autoClose:2500}),h=JSON.parse(l),c(h),d(h.timestamps.length-1),t.connectToForkDoc(h.forkRoom,h.sessionId),S.current=await m(r,n,w(e),i)),u(!0),_.current=!1,h}}catch(e){console.error("Error fetching data:",e)}}(w(e))},className:"jp-mod-highlighted",title:"Document Timeline"},x().createElement(J.historyIcon.react,{marginRight:"4px"})),h&&x().createElement("div",{className:"jp-timestampDisplay"},x().createElement("input",{type:"range",min:0,max:a.timestamps.length-1,value:l,onChange:async e=>{const t=parseInt(e.target.value),n=Math.abs(t-l);try{const e=function(e){return e<l?"undo":"redo"}(t);if(d(t),y.current&&(v(!0),y.current=!1),!S.current)return void console.error("Session is not initialized");await f(`${S.current.format}:${S.current.type}:${S.current.fileId}`,e,n,a.forkRoom,i)}catch(e){console.error("Error fetching or applying updates:",e)}},className:"jp-Slider"}),x().createElement("div",null,x().createElement("strong",null,w(e).split("/").pop()," ")," "),p&&x().createElement("div",{className:"jp-restoreBtnContainer"},x().createElement("button",{onClick:async()=>{if(!S.current)return void console.error("Session is not initialized");const e=await f(`${S.current.format}:${S.current.type}:${S.current.fileId}`,"restore",0,a.forkRoom,i);200===e.code?(s.Notification.success(e.status,{autoClose:4e3}),t.reconnect(),u(!1),_.current=!0):s.Notification.error(e.status,{autoClose:4e3})},className:"jp-ToolbarButtonComponent jp-restoreBtn"},"Restore version"," ",(e=>{const t=new Date(1e3*e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`})(a.timestamps[l])))))};class V extends s.ReactWidget{constructor(e,t,n,r,o,s){super(),this.apiURL=e,this.provider=t,this.contentType=n,this.format=r,this.documentTimelineUrl=o,this._serverSettings=s,this.addClass("jp-timelineSliderWrapper")}render(){return E.createElement(B,{key:this.apiURL,apiURL:this.apiURL,provider:this.provider,contentType:this.contentType,format:this.format,documentTimelineUrl:this.documentTimelineUrl,serverSettings:this._serverSettings})}updateContent(e,t){this.apiURL=e,this.provider=t,this.contentType=this.provider.contentType,this.format=this.provider.format,this.update()}}const q=new _.Token("@jupyter/docprovider:IForkManagerToken"),K="https://schema.jupyter.org/jupyter_collaboration/fork/v1";class z{constructor(e){this._disposed=!1,this._forkAddedSignal=new y.Signal(this),this._forkDeletedSignal=new y.Signal(this);const{contentProvider:t,eventManager:n}=e;this._contentProvider=t,this._eventManager=n,this._eventManager.stream.connect(this._handleEvent,this),this._serverSettings=e.serverSettings}get isDisposed(){return this._disposed}get forkAdded(){return this._forkAddedSignal}get forkDeleted(){return this._forkDeletedSignal}dispose(){var e;this._disposed||(null===(e=this._eventManager)||void 0===e||e.stream.disconnect(this._handleEvent),this._disposed=!0)}async createFork(e){const{rootId:t,title:n,description:r,synchronize:o}=e,s={method:"PUT",body:JSON.stringify({title:n,description:r,synchronize:o})},a=i.URLExt.join(p,t);return await v(a,s,this._serverSettings)}async getAllForks(e){const t=i.URLExt.join(p,e);return await v(t,{method:"GET"},this._serverSettings)}async deleteFork(e){const{forkId:t,merge:n}=e,r=i.URLExt.join(p,t),o=i.URLExt.objectToQueryString({merge:n});await v(`${r}${o}`,{method:"DELETE"},this._serverSettings)}getProvider(e){const{documentPath:t,format:n,type:r}=e,o=this._contentProvider;if(o){const e=t;return o.providers.get(`${n}:${r}:${e}`)}}_handleEvent(e,t){if(t.schema_id===K)switch(t.action){case"create":this._forkAddedSignal.emit(t);break;case"delete":this._forkDeletedSignal.emit(t)}}}}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_jupyter_collaboration_extension=self.webpackChunk_jupyter_collaboration_extension||[]).push([[393],{6393:(e,t,s)=>{s.r(t),s.d(t,{Collaborator:()=>C,CollaboratorsBody:()=>b,CollaboratorsPanel:()=>y,DefaultIconRenderer:()=>G,IUserMenu:()=>r,RendererUserMenu:()=>P,UserInfoBody:()=>V,UserInfoPanel:()=>z,UserMenu:()=>N,UsersItem:()=>q,remoteUserCursors:()=>U,showSharedLinkDialog:()=>B});var n=s(7262);const r=new n.Token("@jupyter/collaboration:IUserMenu");var a=s(7324),i=s(5882),o=s(4602),l=s(1247),c=s(3345),d=s.n(c);const h="jp-CollaboratorsList",u="jp-Collaborator",p="jp-CollaboratorHeader",_="jp-CollaboratorHeaderCollapser",m="jp-ClickableCollaborator",v="jp-CollaboratorIcon",g="jp-CollaboratorFiles",f="jp-CollaboratorFile";class y extends l.Panel{constructor(e,t,s,n){super({}),this._onAwarenessChanged=()=>{const e=this._awareness.getStates(),t=new Map;e.forEach(((e,s)=>{if(this._currentUser.isReady&&e.user&&e.user.username!==this._currentUser.identity.username){const s=`${e.user.username}-${e.current||"no-current"}`;t.has(s)||t.set(s,e)}})),this._collaboratorsChanged.emit(Array.from(t.values()))},this._collaboratorsChanged=new o.Signal(this),this._awareness=t,this._currentUser=e,this.addClass("jp-CollaboratorsPanel"),this.addWidget(a.ReactWidget.create(d().createElement(b,{fileopener:s,collaboratorsChanged:this._collaboratorsChanged,docRegistry:n}))),this._awareness.on("change",this._onAwarenessChanged)}}function b(e){const[t,s]=(0,c.useState)([]);return e.collaboratorsChanged.connect(((e,t)=>{s(t)})),d().createElement("div",{className:h},t.map((t=>{const s=`${t.user.username}-${t.current||"no-current"}`;return d().createElement(C,{key:s,collaborator:t,fileopener:e.fileopener,docRegistry:e.docRegistry})})))}function C(e){const[t,s]=(0,c.useState)(!1),{collaborator:n,fileopener:r}=e;let a="";if(n.current){const e=n.current.split(":");a=`${e[1]}`}const o=n.documents||[],l=o.map((t=>{var s,n;const r=null===(n=null===(s=e.docRegistry)||void 0===s?void 0:s.getFileTypesForPath(t))||void 0===n?void 0:n.filter((e=>void 0!==e.icon)),a=(null==r?void 0:r.length)?r[0].icon:i.fileIcon,o=(null==r?void 0:r.length)?r[0].iconClass:void 0;return{filename:t.length>40?t.slice(0,10).concat("…").concat(t.slice(t.length-15)):t,fileLocation:t,icon:a,iconClass:o}}));return d().createElement("div",{className:u},d().createElement("div",{className:l.length?`${m} ${p}`:p,onClick:o?()=>{l.length&&s(!t)}:void 0},d().createElement(i.LabIcon.resolveReact,{icon:i.caretDownIcon,className:_+(t?" jp-mod-expanded":""),tag:"div"}),d().createElement("div",{className:v,style:{backgroundColor:n.user.color}},d().createElement("span",null,n.user.initials)),d().createElement("span",null,n.user.display_name)),d().createElement("div",{className:`${g} jp-DirListing`,style:t?{}:{display:"none"}},d().createElement("ul",{className:"jp-DirListing-content"},l.map((e=>d().createElement("li",{className:"jp-DirListing-item "+(e.fileLocation===a?`${f} jp-mod-running`:f),key:e.filename,onClick:()=>r(e.fileLocation)},d().createElement(i.LabIcon.resolveReact,{icon:e.icon,iconClass:e.iconClass,tag:"span",className:"jp-DirListing-itemIcon",stylesheet:"listing"}),d().createElement("span",{className:"jp-DirListing-itemText",title:e.fileLocation},e.filename)))))))}var w=s(195),k=s(5024),j=s(2206);const S=w.Facet.define({combine:e=>e[e.length-1]}),E=k.EditorView.baseTheme({".jp-remote-cursor":{borderLeft:"1px solid black",marginLeft:"-1px"},".jp-remote-cursor.jp-mod-primary":{borderLeftWidth:"2px"},".jp-remote-selection":{opacity:.5},".cm-tooltip":{border:"none"},".cm-tooltip .jp-remote-userInfo":{color:"var(--jp-ui-inverse-font-color0)",padding:"0px 2px"}}),x=w.Annotation.define();class L{constructor(e,t){this.style=e,this.marker=t}draw(){const e=this.marker.draw();for(const[t,s]of Object.entries(this.style))e.style[t]=s;return e}eq(e){return this.marker.eq(e.marker)&&n.JSONExt.deepEqual(this.style,e.style)}update(e,t){for(const[t,s]of Object.entries(this.style))e.style[t]=s;return this.marker.update(e,t.marker)}}const A=(0,k.layer)({above:!0,markers(e){const{awareness:t,ytext:s}=e.state.facet(S),n=s.doc,r=[];return t.getStates().forEach(((a,i)=>{var o,l,c;if(i===t.doc.clientID)return;const d=a.cursors;for(const t of null!=d?d:[]){if(!(null==t?void 0:t.anchor)||!(null==t?void 0:t.head))return;const i=(0,j.createAbsolutePositionFromRelativePosition)(t.anchor,n),d=(0,j.createAbsolutePositionFromRelativePosition)(t.head,n);if((null==i?void 0:i.type)!==s||(null==d?void 0:d.type)!==s)return;const h=null===(o=t.primary)||void 0===o||o?"jp-remote-cursor jp-mod-primary":"jp-remote-cursor",u=w.EditorSelection.cursor(d.index,d.index>i.index?-1:1);for(const t of k.RectangleMarker.forRange(e,h,u))r.push(new L({borderLeftColor:null!==(c=null===(l=a.user)||void 0===l?void 0:l.color)&&void 0!==c?c:"black"},t))}})),r},update:(e,t)=>!!e.transactions.find((e=>e.annotation(x))),class:"jp-remote-cursors"}),I=(0,k.hoverTooltip)(((e,t)=>{var s;const{awareness:n,ytext:r}=e.state.facet(S),a=r.doc;for(const[e,i]of n.getStates())if(e!==n.doc.clientID)for(const e of null!==(s=i.cursors)&&void 0!==s?s:[]){if(!(null==e?void 0:e.head))continue;const s=(0,j.createAbsolutePositionFromRelativePosition)(e.head,a);if((null==s?void 0:s.type)===r&&s.index-3<=t&&t<=s.index+3)return{pos:s.index,above:!0,create:()=>{var e,t,s,n;const r=document.createElement("div");return r.classList.add("jp-remote-userInfo"),r.style.backgroundColor=null!==(t=null===(e=i.user)||void 0===e?void 0:e.color)&&void 0!==t?t:"darkgrey",r.textContent=null!==(n=null===(s=i.user)||void 0===s?void 0:s.display_name)&&void 0!==n?n:"Anonymous",{dom:r}}}}return null}),{hideOn:(e,t)=>!!e.annotation(x),hoverTime:0}),M=(0,k.layer)({above:!1,markers(e){const{awareness:t,ytext:s}=e.state.facet(S),n=s.doc,r=[];return t.getStates().forEach(((a,i)=>{var o,l,c;if(i===t.doc.clientID)return;const d=a.cursors;for(const t of null!=d?d:[]){if(null===(o=t.empty)||void 0===o||o||!(null==t?void 0:t.anchor)||!(null==t?void 0:t.head))return;const i=(0,j.createAbsolutePositionFromRelativePosition)(t.anchor,n),d=(0,j.createAbsolutePositionFromRelativePosition)(t.head,n);if((null==i?void 0:i.type)!==s||(null==d?void 0:d.type)!==s)return;const h="jp-remote-selection";for(const t of k.RectangleMarker.forRange(e,h,w.EditorSelection.range(i.index,d.index)))r.push(new L({backgroundColor:null!==(c=null===(l=a.user)||void 0===l?void 0:l.color)&&void 0!==c?c:"black"},t))}})),r},update:(e,t)=>!!e.transactions.find((e=>e.annotation(x))),class:"jp-remote-selections"}),R=k.ViewPlugin.fromClass(class{constructor(e){this.editorAwareness=e.state.facet(S),this._listener=({added:t,updated:s,removed:n})=>{t.concat(s).concat(n).findIndex((e=>e!==this.editorAwareness.awareness.doc.clientID))>=0&&e.dispatch({annotations:[x.of([])]})},this.editorAwareness.awareness.on("change",this._listener)}destroy(){this.editorAwareness.awareness.off("change",this._listener)}update(e){var t;if(!e.docChanged&&!e.selectionSet)return;const{awareness:s,ytext:r}=this.editorAwareness,a=s.getLocalState();if(a){const i=e.view.hasFocus&&e.view.dom.ownerDocument.hasFocus(),o=e.state.selection,l=new Array;if(i&&o){for(const e of o.ranges){const t=e===o.main,s=(0,j.createRelativePositionFromTypeIndex)(r,e.anchor),n=(0,j.createRelativePositionFromTypeIndex)(r,e.head);l.push({anchor:s,head:n,primary:t,empty:e.empty})}if(!a.cursors||l.length>0){const e=null===(t=a.cursors)||void 0===t?void 0:t.map((e=>({...e,anchor:(null==e?void 0:e.anchor)?(0,j.createRelativePositionFromJSON)(e.anchor):null,head:(null==e?void 0:e.head)?(0,j.createRelativePositionFromJSON)(e.head):null})));n.JSONExt.deepEqual(l,e)||s.setLocalStateField("cursors",l)}}}}},{provide:()=>[E,A,M,I,(0,k.tooltips)({position:"absolute",parent:document.body})]});function U(e){return[S.of(e),R]}var D=s(4873);class P extends l.MenuBar.Renderer{constructor(e){super(),this._user=e}renderItem(e){const t=this.createItemClass(e),s=this.createItemDataset(e),n=this.createItemARIA(e);return D.h.li({className:t,dataset:s,tabindex:"0",onfocus:e.onfocus,...n},this._createUserIcon(),this.renderLabel(e),this.renderIcon(e))}renderLabel(e){const t=this.formatLabel(e);return D.h.div({className:"lm-MenuBar-itemLabel jp-MenuBar-label"},t)}_createUserIcon(){return this._user.isReady&&this._user.identity.avatar_url?D.h.div({className:"lm-MenuBar-itemIcon jp-MenuBar-imageIcon"},D.h.img({src:this._user.identity.avatar_url})):this._user.isReady?D.h.div({className:"lm-MenuBar-itemIcon jp-MenuBar-anonymousIcon",style:{backgroundColor:this._user.identity.color}},D.h.span({},this._user.identity.initials)):D.h.div({className:"lm-MenuBar-itemIcon jp-MenuBar-anonymousIcon"},i.userIcon)}}class N extends l.Menu{constructor(e){super(e)}}var T=s(3603),O=s(248);async function B({translator:e}){const t=(null!=e?e:O.nullTranslator).load("jupyter_collaboration"),s=T.PageConfig.getToken(),n=new URL(T.URLExt.normalize(T.PageConfig.getUrl({workspace:T.PageConfig.defaultWorkspace})));let r=!1,i=!1,o=!1,l=!1,c="",d="",h="";if(""!==T.PageConfig.getOption("hubUser")){h=T.PageConfig.getOption("hubServerUser"),d=T.PageConfig.getOption("hubServerName"),c=`${T.PageConfig.getOption("hubHost")||""}${T.PageConfig.getOption("hubPrefix")}api`;const e=await fetch(c,{headers:{Authorization:`token ${s}`}}),t=(await e.json()).version,[n]=t.split(".").map(Number);if(n>=5){const e=await fetch(`${c}/user`,{headers:{Authorization:`token ${s}`}}),t=await e.json();t.scopes.includes("read:users:name")&&(h===T.PageConfig.getOption("hubUser")&&t.scopes.includes("shares!user")||t.scopes.includes("shares!user="+h)||t.scopes.includes("shares!server="+h+"/"+d))&&(r=!0,(t.scopes.includes("list:users")||t.scopes.includes("read:users")||t.scopes.includes("admin:users"))&&(i=!0),(t.scopes.includes("list:groups")||t.scopes.includes("read:groups")||t.scopes.includes("admin:groups"))&&(o=!0),(h===T.PageConfig.getOption("hubUser")&&t.scopes.includes("servers!user")||t.scopes.includes("servers!user="+h)||t.scopes.includes("servers!server="+h+"/"+d+"/")||t.scopes.includes("admin:servers"))&&(l=!0))}}if(r){let e=d;return""===e&&(e="default"),(0,a.showDialog)({title:t.__("Share Jupyter Server %1",e),body:new $(n.toString(),d,i,o,l,h,c,s,t),buttons:[a.Dialog.cancelButton({label:t.__("Close"),caption:t.__("Close the dialog")}),a.Dialog.okButton({label:t.__("Copy Link"),caption:t.__("Copy the link to the Jupyter Server")})]})}return(0,a.showDialog)({title:t.__("Share Jupyter Server Link"),body:new F(n.toString(),s,""!==T.PageConfig.getOption("hubUser"),t),buttons:[a.Dialog.cancelButton(),a.Dialog.okButton({label:t.__("Copy Link"),caption:t.__("Copy the link to the Jupyter Server")})]})}class $ extends l.Widget{constructor(e,t,s,n,r,a,i,o,l){super(),this._url=e,this._serverName=t,this._canListUsers=s,this._canListGroups=n,this._canControlServer=r,this._serverOwner=a,this._hubApiUrl=i,this._token=o,this._trans=l,this._recipients=[],this._shares=[],this._searchInput=null,this._searchResults=null,this._sharesContainer=null,this._populateBody(this.node),this.addClass("jp-shared-link-body"),this._loadShares().then((()=>{this._updateSharesList().then((()=>{this._loadUsers()}))}))}getValue(){return this._url}onAfterAttach(e){super.onAfterAttach(e)}onBeforeDetach(e){super.onBeforeDetach(e)}async _loadUsers(){if(this._canListUsers){let e=0;const t=200;let s=[],n=!0;for(;n;){const r=await fetch(`${this._hubApiUrl}/users?limit=${t}&offset=${e}`,{headers:{Authorization:`token ${this._token}`}}),a=await r.json();s=s.concat(a),n=a.length===t,e+=t}const r=new Set(this._shares.filter((e=>"user"===e.type)).map((e=>e.name)));this._recipients=s.filter((e=>e.name!==this._serverOwner&&!r.has(e.name))).map((e=>({...e,type:"user"})))}if(this._canListGroups){const e=await fetch(`${this._hubApiUrl}/groups`,{headers:{Authorization:`token ${this._token}`}}),t=await e.json(),s=new Set(this._shares.filter((e=>"group"===e.type)).map((e=>e.name)));this._recipients=this._recipients.concat(t.filter((e=>!s.has(e.name))).map((e=>({name:e.name,type:"group"}))))}this._recipients.sort(((e,t)=>e.name.localeCompare(t.name))),this._updateSearchResults()}async _loadShares(){const e=await fetch(`${this._hubApiUrl}/shares/${this._serverOwner}/${this._serverName}`,{headers:{Authorization:`token ${this._token}`}}),t=await e.json();this._shares=t.items.map((e=>{var t,s;return{name:(null===(t=e.user)||void 0===t?void 0:t.name)||(null===(s=e.group)||void 0===s?void 0:s.name),createdAt:e.created_at,type:e.user?"user":"group"}}))}async _createShare(e,t){const s=["access:servers!server="+this._serverOwner+"/"+this._serverName];this._canControlServer&&s.push("servers!server="+this._serverOwner+"/"+this._serverName),await fetch(`${this._hubApiUrl}/shares/${this._serverOwner}/${this._serverName}`,{method:"POST",headers:{Authorization:`token ${this._token}`,"Content-Type":"application/json"},body:JSON.stringify({[t]:e.name,scopes:s})})}async _deleteShare(e,t){await fetch(`${this._hubApiUrl}/shares/${this._serverOwner}/${this._serverName}`,{method:"PATCH",headers:{Authorization:`token ${this._token}`},body:JSON.stringify({[t]:e.name})})}_populateBody(e){const t=document.createElement("div");t.classList.add("jp-ManageSharesBody-search-container"),this._searchInput=document.createElement("input"),this._searchInput.type="text",this._searchInput.classList.add("jp-ManageSharesBody-search-input"),this._searchInput.placeholder=this._trans.__("Type to search for a user or a group to share your server with..."),this._searchInput.addEventListener("input",(()=>{this._updateSearchResults()})),t.appendChild(this._searchInput),e.appendChild(t),this._searchResults=document.createElement("div"),this._searchResults.classList.add("jp-ManageSharesBody-search-results"),e.appendChild(this._searchResults),this._sharesContainer=document.createElement("div"),this._sharesContainer.classList.add("jp-ManageSharesBody-selected-users"),e.appendChild(this._sharesContainer);const s=document.createElement("input");s.classList.add("jp-ManageSharesBody-url-input"),s.readOnly=!0,s.value=this._url,e.appendChild(s),e.insertAdjacentHTML("beforeend","<br>"),e.insertAdjacentText("beforeend",this._trans.__("Warning: Anyone you share this server with will have access to all your files, not just the currently open file.")),e.insertAdjacentHTML("beforeend","<br>"),e.insertAdjacentText("beforeend",this._trans.__("If your Hub administrator allows it, you can create another server dedicated to sharing a specific project."))}_updateSearchResults(){var e;if(!this._searchResults)return;this._searchResults.innerHTML="";const t=(null===(e=this._searchInput)||void 0===e?void 0:e.value)||"";this._recipients.filter((e=>e.name.toLowerCase().includes(t.toLowerCase())||""===t)).forEach((e=>{var t;const s=document.createElement("div");s.classList.add("jp-ManageSharesBody-user-item"),"group"===e.type?s.textContent=this._trans.__("Group %1",e.name):s.textContent=e.name,s.addEventListener("click",(async()=>{await this._createShare(e,e.type),await this._loadShares(),await this._updateSharesList();const t=new Set(this._shares.map((e=>e.name)));this._recipients=this._recipients.filter((e=>e.name!==this._serverOwner&&!t.has(e.name))),this._updateSearchResults()})),null===(t=this._searchResults)||void 0===t||t.appendChild(s)}))}async _updateSharesList(){if(!this._sharesContainer)return;this._sharesContainer.innerHTML="";const e=document.createElement("table");e.classList.add("jp-ManageSharesBody-shares-table");const t=document.createElement("tr"),s=document.createElement("th");s.textContent=this._trans.__("Shared with");const n=document.createElement("th");n.textContent=this._trans.__("Shared since");const r=document.createElement("th");if(r.textContent=this._trans.__("Actions"),t.appendChild(s),t.appendChild(n),t.appendChild(r),e.appendChild(t),0===this._shares.length){const t=document.createElement("tr"),s=document.createElement("td");s.colSpan=3,s.textContent=this._trans.__("Your server is not shared to anybody yet. You can search for users and groups above."),t.appendChild(s),e.appendChild(t)}else this._shares.forEach((t=>{const s=document.createElement("tr"),n=document.createElement("td");"group"===t.type?n.textContent=this._trans.__("Group %1",t.name):n.textContent=t.name,s.appendChild(n);const r=document.createElement("td"),a=new Date(t.createdAt).toLocaleString([],{hour:"2-digit",minute:"2-digit",year:"numeric",month:"2-digit",day:"2-digit"});r.textContent=a,s.appendChild(r);const i=document.createElement("td"),o=document.createElement("button");o.textContent=this._trans.__("Revoke"),o.classList.add("jp-mod-styled"),o.addEventListener("click",(async()=>{await this._deleteShare(t,t.type),await this._loadShares(),await this._updateSharesList(),await this._loadUsers();const e=new Set(this._shares.map((e=>e.name)));this._recipients=this._recipients.filter((t=>t.name!==this._serverOwner&&!e.has(t.name))),this._updateSearchResults()})),i.appendChild(o),s.appendChild(i),e.appendChild(s)}));this._sharesContainer.appendChild(e)}}class F extends l.Widget{constructor(e,t,s,n){super(),this._url=e,this._token=t,this._behindHub=s,this._trans=n,this._tokenCheckbox=null,this._onTokenChange=e=>{const t=e.target;this._updateContent(null==t?void 0:t.checked)},this._warning=document.createElement("div"),this._populateBody(this.node),this.addClass("jp-shared-link-body")}getValue(){var e;if(!0===(null===(e=this._tokenCheckbox)||void 0===e?void 0:e.checked)){const e=new URL(this._url);return e.searchParams.set("token",this._token),e.toString()}return this._url}onAfterAttach(e){var t;super.onAfterAttach(e),null===(t=this._tokenCheckbox)||void 0===t||t.addEventListener("change",this._onTokenChange)}onBeforeDetach(e){var t;null===(t=this._tokenCheckbox)||void 0===t||t.removeEventListener("change",this._onTokenChange),super.onBeforeDetach(e)}_updateContent(e){this._warning.innerHTML="";const t=this.node.querySelector("input[readonly]");if(e){if(t){const e=new URL(this._url);e.searchParams.set("token",this._token.slice(0,5)),t.value=e.toString()+"…"}this._warning.appendChild(document.createElement("h3")).textContent=this._trans.__("Security warning!"),this._warning.insertAdjacentText("beforeend",this._trans.__("Anyone with this link has full access to your notebook server, including all your files!")),this._warning.insertAdjacentHTML("beforeend","<br>"),this._warning.insertAdjacentText("beforeend",this._trans.__("Please be careful who you share it with.")),this._warning.insertAdjacentHTML("beforeend","<br>"),this._behindHub?(this._warning.insertAdjacentText("beforeend",this._trans.__("They will be able to access this server AS YOU.")),this._warning.insertAdjacentHTML("beforeend","<br>"),this._warning.insertAdjacentText("beforeend",this._trans.__("To revoke access, go to File -> Hub Control Panel, and restart your server."))):this._warning.insertAdjacentText("beforeend",this._trans.__("Currently, there is no way to revoke access other than shutting down your server."))}else t&&(t.value=this._url),this._behindHub?this._warning.insertAdjacentText("beforeend",this._trans.__("Only users with `access:servers` permissions for this server will be able to use this link.")):this._warning.insertAdjacentText("beforeend",this._trans.__("Only authenticated users will be able to use this link."))}_populateBody(e){const t=document.createElement("input");if(t.readOnly=!0,t.value=this._url,e.appendChild(t),this._token){const t=e.appendChild(document.createElement("label"));t.insertAdjacentHTML("beforeend",'<input type="checkbox">'),this._tokenCheckbox=t.firstChild,t.insertAdjacentText("beforeend",this._trans.__("Include token in URL")),e.insertAdjacentElement("beforeend",this._warning),this._updateContent(!1)}}}var H=s(5596);function W(e){const{userManager:t,onClick:s}=e,[n,r]=(0,c.useState)(t.identity);return(0,c.useEffect)((()=>{const e=()=>{r(t.identity)};return t.userChanged.connect(e),()=>{t.userChanged.disconnect(e)}}),[t]),d().createElement("div",{title:n.display_name,className:"jp-UserInfo-Icon",style:{backgroundColor:n.color},onClick:s},d().createElement("span",null,n.initials))}class J extends i.ReactWidget{constructor(e){super(),this._onChange=(e,t)=>{var s;const n=(null===(s=this._userManager.permissions)||void 0===s?void 0:s.updatable_fields)||[];(null==n?void 0:n.includes(t))&&(this._userUpdate[t]=e.target.value)},this._userUpdate={},this._userManager=e.userManager}getValue(){return this._userUpdate}render(){var e;const t=this._userManager.identity;if(!t)return d().createElement("div",{className:"jp-UserInfo-Details"},"Error loading user info");const s=(null===(e=this._userManager.permissions)||void 0===e?void 0:e.updatable_fields)||[];return d().createElement("div",{className:"jp-UserInfo-Details"},Object.keys(t).map((e=>{const n=`jp-UserInfo-Value-${e}`;return d().createElement("div",{key:e,className:"jp-UserInfo-Field"},d().createElement("label",{htmlFor:n},e),d().createElement("input",{type:"text",name:e,id:n,onInput:t=>this._onChange(t,e),defaultValue:t[e],disabled:!(null==s?void 0:s.includes(e))}))})))}}class z extends l.Panel{constructor(e){super({}),this.addClass("jp-UserInfoPanel"),this._profile=e.userManager,this._body=null,this._profile.isReady?(this._body=new V({userManager:this._profile,trans:e.trans}),this.addWidget(this._body),this.update()):this._profile.ready.then((()=>{this._body=new V({userManager:this._profile,trans:e.trans}),this.addWidget(this._body),this.update()})).catch((e=>console.error(e)))}}class V extends a.ReactWidget{constructor(e){super(),this.onClick=()=>{this._userManager.identity&&(0,a.showDialog)({body:new J({userManager:this._userManager}),title:this._trans.__("User Details")}).then((async e=>{if(e.button.accept)try{const t=H.ServerConnection.makeSettings(),s=T.URLExt.join(t.baseUrl,"/api/me"),n={method:"PATCH",body:JSON.stringify(e.value)};let r;try{r=await H.ServerConnection.makeRequest(s,n,t)}catch(e){throw new H.ServerConnection.NetworkError(e)}if(!r.ok){const e=this._trans.__("Failed to update user data");throw new Error(e)}this._userManager.refreshUser()}catch(e){console.error(e)}}))},this._userManager=e.userManager,this._trans=e.trans}get user(){return this._userManager}set user(e){this._userManager=e,this.update()}render(){return c.createElement("div",{className:"jp-UserInfo-Container"},c.createElement(W,{userManager:this._userManager,onClick:this.onClick}))}}class q extends c.Component{constructor(e){var t;super(e),this._awarenessChange=()=>{var e;const t=null===(e=this._model)||void 0===e?void 0:e.sharedModel.awareness.getStates(),s=[];t&&t.forEach(((e,t)=>{e.user&&s.push({userId:t,userData:e.user})})),this.setState((e=>({...e,usersList:s})))},this._model=e.model,this._iconRenderer=null!==(t=e.iconRenderer)&&void 0!==t?t:null,this.state={usersList:[]}}static createWidget(e){return i.ReactWidget.create(c.createElement(q,{...e}))}componentDidMount(){var e;null===(e=this._model)||void 0===e||e.sharedModel.awareness.on("change",this._awarenessChange),this._awarenessChange()}filterDuplicated(e){var t;const s=[],n=new Set;for(const r of e)(null===(t=null==r?void 0:r.userData)||void 0===t?void 0:t.username)&&!n.has(r.userData.username)&&(n.add(r.userData.username),s.push(r));return s}render(){var e;const t=null!==(e=this._iconRenderer)&&void 0!==e?e:G;return c.createElement("div",{className:"jp-toolbar-users-item"},this.filterDuplicated(this.state.usersList).map((e=>{if(this._model&&e.userId!==this._model.sharedModel.awareness.clientID)return t({user:e,model:this._model})})))}}function G(e){let t;const{user:s,model:n,...r}=e,a=(0,i.classes)("lm-MenuBar-itemIcon",e.className||"");return t=s.userData.avatar_url?c.createElement("div",{...r,key:s.userId,title:s.userData.display_name,className:(0,i.classes)(a,"jp-MenuBar-imageIcon")},c.createElement("img",{src:s.userData.avatar_url,alt:""})):c.createElement("div",{...r,key:s.userId,title:s.userData.display_name,className:(0,i.classes)(a,"jp-MenuBar-anonymousIcon"),style:{backgroundColor:s.userData.color}},c.createElement("span",null,s.userData.initials)),t}}}]);
|
|
1
|
+
"use strict";(self.webpackChunk_jupyter_collaboration_extension=self.webpackChunk_jupyter_collaboration_extension||[]).push([[393],{6393:(e,t,s)=>{s.r(t),s.d(t,{Collaborator:()=>C,CollaboratorsBody:()=>b,CollaboratorsPanel:()=>y,DefaultIconRenderer:()=>G,IUserMenu:()=>r,RendererUserMenu:()=>P,UserInfoBody:()=>V,UserInfoPanel:()=>z,UserMenu:()=>N,UsersItem:()=>q,remoteUserCursors:()=>U,showSharedLinkDialog:()=>B});var n=s(7262);const r=new n.Token("@jupyter/collaboration:IUserMenu");var a=s(5285),i=s(3391),o=s(4602),l=s(1247),c=s(3345),d=s.n(c);const h="jp-CollaboratorsList",u="jp-Collaborator",p="jp-CollaboratorHeader",_="jp-CollaboratorHeaderCollapser",m="jp-ClickableCollaborator",v="jp-CollaboratorIcon",g="jp-CollaboratorFiles",f="jp-CollaboratorFile";class y extends l.Panel{constructor(e,t,s,n){super({}),this._onAwarenessChanged=()=>{const e=this._awareness.getStates(),t=new Map;e.forEach(((e,s)=>{if(this._currentUser.isReady&&e.user&&e.user.username!==this._currentUser.identity.username){const s=`${e.user.username}-${e.current||"no-current"}`;t.has(s)||t.set(s,e)}})),this._collaboratorsChanged.emit(Array.from(t.values()))},this._collaboratorsChanged=new o.Signal(this),this._awareness=t,this._currentUser=e,this.addClass("jp-CollaboratorsPanel"),this.addWidget(a.ReactWidget.create(d().createElement(b,{fileopener:s,collaboratorsChanged:this._collaboratorsChanged,docRegistry:n}))),this._awareness.on("change",this._onAwarenessChanged)}}function b(e){const[t,s]=(0,c.useState)([]);return e.collaboratorsChanged.connect(((e,t)=>{s(t)})),d().createElement("div",{className:h},t.map((t=>{const s=`${t.user.username}-${t.current||"no-current"}`;return d().createElement(C,{key:s,collaborator:t,fileopener:e.fileopener,docRegistry:e.docRegistry})})))}function C(e){const[t,s]=(0,c.useState)(!1),{collaborator:n,fileopener:r}=e;let a="";if(n.current){const e=n.current.split(":");a=`${e[1]}`}const o=n.documents||[],l=o.map((t=>{var s,n;const r=null===(n=null===(s=e.docRegistry)||void 0===s?void 0:s.getFileTypesForPath(t))||void 0===n?void 0:n.filter((e=>void 0!==e.icon)),a=(null==r?void 0:r.length)?r[0].icon:i.fileIcon,o=(null==r?void 0:r.length)?r[0].iconClass:void 0;return{filename:t.length>40?t.slice(0,10).concat("…").concat(t.slice(t.length-15)):t,fileLocation:t,icon:a,iconClass:o}}));return d().createElement("div",{className:u},d().createElement("div",{className:l.length?`${m} ${p}`:p,onClick:o?()=>{l.length&&s(!t)}:void 0},d().createElement(i.LabIcon.resolveReact,{icon:i.caretDownIcon,className:_+(t?" jp-mod-expanded":""),tag:"div"}),d().createElement("div",{className:v,style:{backgroundColor:n.user.color}},d().createElement("span",null,n.user.initials)),d().createElement("span",null,n.user.display_name)),d().createElement("div",{className:`${g} jp-DirListing`,style:t?{}:{display:"none"}},d().createElement("ul",{className:"jp-DirListing-content"},l.map((e=>d().createElement("li",{className:"jp-DirListing-item "+(e.fileLocation===a?`${f} jp-mod-running`:f),key:e.filename,onClick:()=>r(e.fileLocation)},d().createElement(i.LabIcon.resolveReact,{icon:e.icon,iconClass:e.iconClass,tag:"span",className:"jp-DirListing-itemIcon",stylesheet:"listing"}),d().createElement("span",{className:"jp-DirListing-itemText",title:e.fileLocation},e.filename)))))))}var w=s(195),k=s(5024),S=s(2206);const j=w.Facet.define({combine:e=>e[e.length-1]}),E=k.EditorView.baseTheme({".jp-remote-cursor":{borderLeft:"1px solid black",marginLeft:"-1px"},".jp-remote-cursor.jp-mod-primary":{borderLeftWidth:"2px"},".jp-remote-selection":{opacity:.5},".cm-tooltip":{border:"none"},".cm-tooltip .jp-remote-userInfo":{color:"var(--jp-ui-inverse-font-color0)",padding:"0px 2px"}}),x=w.Annotation.define();class L{constructor(e,t){this.style=e,this.marker=t}draw(){const e=this.marker.draw();for(const[t,s]of Object.entries(this.style))e.style[t]=s;return e}eq(e){return this.marker.eq(e.marker)&&n.JSONExt.deepEqual(this.style,e.style)}update(e,t){for(const[t,s]of Object.entries(this.style))e.style[t]=s;return this.marker.update(e,t.marker)}}const A=(0,k.layer)({above:!0,markers(e){const{awareness:t,ytext:s}=e.state.facet(j),n=s.doc,r=[];return t.getStates().forEach(((a,i)=>{var o,l,c;if(i===t.doc.clientID)return;const d=a.cursors;for(const t of null!=d?d:[]){if(!(null==t?void 0:t.anchor)||!(null==t?void 0:t.head))return;const i=(0,S.createAbsolutePositionFromRelativePosition)(t.anchor,n),d=(0,S.createAbsolutePositionFromRelativePosition)(t.head,n);if((null==i?void 0:i.type)!==s||(null==d?void 0:d.type)!==s)return;const h=null===(o=t.primary)||void 0===o||o?"jp-remote-cursor jp-mod-primary":"jp-remote-cursor",u=w.EditorSelection.cursor(d.index,d.index>i.index?-1:1);for(const t of k.RectangleMarker.forRange(e,h,u))r.push(new L({borderLeftColor:null!==(c=null===(l=a.user)||void 0===l?void 0:l.color)&&void 0!==c?c:"black"},t))}})),r},update:(e,t)=>!!e.transactions.find((e=>e.annotation(x))),class:"jp-remote-cursors"}),I=(0,k.hoverTooltip)(((e,t)=>{var s;const{awareness:n,ytext:r}=e.state.facet(j),a=r.doc;for(const[e,i]of n.getStates())if(e!==n.doc.clientID)for(const e of null!==(s=i.cursors)&&void 0!==s?s:[]){if(!(null==e?void 0:e.head))continue;const s=(0,S.createAbsolutePositionFromRelativePosition)(e.head,a);if((null==s?void 0:s.type)===r&&s.index-3<=t&&t<=s.index+3)return{pos:s.index,above:!0,create:()=>{var e,t,s,n;const r=document.createElement("div");return r.classList.add("jp-remote-userInfo"),r.style.backgroundColor=null!==(t=null===(e=i.user)||void 0===e?void 0:e.color)&&void 0!==t?t:"darkgrey",r.textContent=null!==(n=null===(s=i.user)||void 0===s?void 0:s.display_name)&&void 0!==n?n:"Anonymous",{dom:r}}}}return null}),{hideOn:(e,t)=>!!e.annotation(x),hoverTime:0}),M=(0,k.layer)({above:!1,markers(e){const{awareness:t,ytext:s}=e.state.facet(j),n=s.doc,r=[];return t.getStates().forEach(((a,i)=>{var o,l,c;if(i===t.doc.clientID)return;const d=a.cursors;for(const t of null!=d?d:[]){if(null===(o=t.empty)||void 0===o||o||!(null==t?void 0:t.anchor)||!(null==t?void 0:t.head))return;const i=(0,S.createAbsolutePositionFromRelativePosition)(t.anchor,n),d=(0,S.createAbsolutePositionFromRelativePosition)(t.head,n);if((null==i?void 0:i.type)!==s||(null==d?void 0:d.type)!==s)return;const h="jp-remote-selection";for(const t of k.RectangleMarker.forRange(e,h,w.EditorSelection.range(i.index,d.index)))r.push(new L({backgroundColor:null!==(c=null===(l=a.user)||void 0===l?void 0:l.color)&&void 0!==c?c:"black"},t))}})),r},update:(e,t)=>!!e.transactions.find((e=>e.annotation(x))),class:"jp-remote-selections"}),R=k.ViewPlugin.fromClass(class{constructor(e){this.editorAwareness=e.state.facet(j),this._listener=({added:t,updated:s,removed:n})=>{t.concat(s).concat(n).findIndex((e=>e!==this.editorAwareness.awareness.doc.clientID))>=0&&e.dispatch({annotations:[x.of([])]})},this.editorAwareness.awareness.on("change",this._listener)}destroy(){this.editorAwareness.awareness.off("change",this._listener)}update(e){var t;if(!e.docChanged&&!e.selectionSet)return;const{awareness:s,ytext:r}=this.editorAwareness,a=s.getLocalState();if(a){const i=e.view.hasFocus&&e.view.dom.ownerDocument.hasFocus(),o=e.state.selection,l=new Array;if(i&&o){for(const e of o.ranges){const t=e===o.main,s=(0,S.createRelativePositionFromTypeIndex)(r,e.anchor),n=(0,S.createRelativePositionFromTypeIndex)(r,e.head);l.push({anchor:s,head:n,primary:t,empty:e.empty})}if(!a.cursors||l.length>0){const e=null===(t=a.cursors)||void 0===t?void 0:t.map((e=>({...e,anchor:(null==e?void 0:e.anchor)?(0,S.createRelativePositionFromJSON)(e.anchor):null,head:(null==e?void 0:e.head)?(0,S.createRelativePositionFromJSON)(e.head):null})));n.JSONExt.deepEqual(l,e)||s.setLocalStateField("cursors",l)}}}}},{provide:()=>[E,A,M,I,(0,k.tooltips)({position:"absolute",parent:document.body})]});function U(e){return[j.of(e),R]}var D=s(4873);class P extends l.MenuBar.Renderer{constructor(e){super(),this._user=e}renderItem(e){const t=this.createItemClass(e),s=this.createItemDataset(e),n=this.createItemARIA(e);return D.h.li({className:t,dataset:s,tabindex:"0",onfocus:e.onfocus,...n},this._createUserIcon(),this.renderLabel(e),this.renderIcon(e))}renderLabel(e){const t=this.formatLabel(e);return D.h.div({className:"lm-MenuBar-itemLabel jp-MenuBar-label"},t)}_createUserIcon(){return this._user.isReady&&this._user.identity.avatar_url?D.h.div({className:"lm-MenuBar-itemIcon jp-MenuBar-imageIcon"},D.h.img({src:this._user.identity.avatar_url})):this._user.isReady?D.h.div({className:"lm-MenuBar-itemIcon jp-MenuBar-anonymousIcon",style:{backgroundColor:this._user.identity.color}},D.h.span({},this._user.identity.initials)):D.h.div({className:"lm-MenuBar-itemIcon jp-MenuBar-anonymousIcon"},i.userIcon)}}class N extends l.Menu{constructor(e){super(e)}}var T=s(4526),O=s(769);async function B({translator:e}){const t=(null!=e?e:O.nullTranslator).load("jupyter_collaboration"),s=T.PageConfig.getToken(),n=new URL(T.URLExt.normalize(T.PageConfig.getUrl({workspace:T.PageConfig.defaultWorkspace})));let r=!1,i=!1,o=!1,l=!1,c="",d="",h="";if(""!==T.PageConfig.getOption("hubUser")){h=T.PageConfig.getOption("hubServerUser"),d=T.PageConfig.getOption("hubServerName"),c=`${T.PageConfig.getOption("hubHost")||""}${T.PageConfig.getOption("hubPrefix")}api`;const e=await fetch(c,{headers:{Authorization:`token ${s}`}}),t=(await e.json()).version,[n]=t.split(".").map(Number);if(n>=5){const e=await fetch(`${c}/user`,{headers:{Authorization:`token ${s}`}}),t=await e.json();t.scopes.includes("read:users:name")&&(h===T.PageConfig.getOption("hubUser")&&t.scopes.includes("shares!user")||t.scopes.includes("shares!user="+h)||t.scopes.includes("shares!server="+h+"/"+d))&&(r=!0,(t.scopes.includes("list:users")||t.scopes.includes("read:users")||t.scopes.includes("admin:users"))&&(i=!0),(t.scopes.includes("list:groups")||t.scopes.includes("read:groups")||t.scopes.includes("admin:groups"))&&(o=!0),(h===T.PageConfig.getOption("hubUser")&&t.scopes.includes("servers!user")||t.scopes.includes("servers!user="+h)||t.scopes.includes("servers!server="+h+"/"+d+"/")||t.scopes.includes("admin:servers"))&&(l=!0))}}if(r){let e=d;return""===e&&(e="default"),(0,a.showDialog)({title:t.__("Share Jupyter Server %1",e),body:new $(n.toString(),d,i,o,l,h,c,s,t),buttons:[a.Dialog.cancelButton({label:t.__("Close"),caption:t.__("Close the dialog")}),a.Dialog.okButton({label:t.__("Copy Link"),caption:t.__("Copy the link to the Jupyter Server")})]})}return(0,a.showDialog)({title:t.__("Share Jupyter Server Link"),body:new F(n.toString(),s,""!==T.PageConfig.getOption("hubUser"),t),buttons:[a.Dialog.cancelButton(),a.Dialog.okButton({label:t.__("Copy Link"),caption:t.__("Copy the link to the Jupyter Server")})]})}class $ extends l.Widget{constructor(e,t,s,n,r,a,i,o,l){super(),this._url=e,this._serverName=t,this._canListUsers=s,this._canListGroups=n,this._canControlServer=r,this._serverOwner=a,this._hubApiUrl=i,this._token=o,this._trans=l,this._recipients=[],this._shares=[],this._searchInput=null,this._searchResults=null,this._sharesContainer=null,this._populateBody(this.node),this.addClass("jp-shared-link-body"),this._loadShares().then((()=>{this._updateSharesList().then((()=>{this._loadUsers()}))}))}getValue(){return this._url}onAfterAttach(e){super.onAfterAttach(e)}onBeforeDetach(e){super.onBeforeDetach(e)}async _loadUsers(){if(this._canListUsers){let e=0;const t=200;let s=[],n=!0;for(;n;){const r=await fetch(`${this._hubApiUrl}/users?limit=${t}&offset=${e}`,{headers:{Authorization:`token ${this._token}`}}),a=await r.json();s=s.concat(a),n=a.length===t,e+=t}const r=new Set(this._shares.filter((e=>"user"===e.type)).map((e=>e.name)));this._recipients=s.filter((e=>e.name!==this._serverOwner&&!r.has(e.name))).map((e=>({...e,type:"user"})))}if(this._canListGroups){const e=await fetch(`${this._hubApiUrl}/groups`,{headers:{Authorization:`token ${this._token}`}}),t=await e.json(),s=new Set(this._shares.filter((e=>"group"===e.type)).map((e=>e.name)));this._recipients=this._recipients.concat(t.filter((e=>!s.has(e.name))).map((e=>({name:e.name,type:"group"}))))}this._recipients.sort(((e,t)=>e.name.localeCompare(t.name))),this._updateSearchResults()}async _loadShares(){const e=await fetch(`${this._hubApiUrl}/shares/${this._serverOwner}/${this._serverName}`,{headers:{Authorization:`token ${this._token}`}}),t=await e.json();this._shares=t.items.map((e=>{var t,s;return{name:(null===(t=e.user)||void 0===t?void 0:t.name)||(null===(s=e.group)||void 0===s?void 0:s.name),createdAt:e.created_at,type:e.user?"user":"group"}}))}async _createShare(e,t){const s=["access:servers!server="+this._serverOwner+"/"+this._serverName];this._canControlServer&&s.push("servers!server="+this._serverOwner+"/"+this._serverName),await fetch(`${this._hubApiUrl}/shares/${this._serverOwner}/${this._serverName}`,{method:"POST",headers:{Authorization:`token ${this._token}`,"Content-Type":"application/json"},body:JSON.stringify({[t]:e.name,scopes:s})})}async _deleteShare(e,t){await fetch(`${this._hubApiUrl}/shares/${this._serverOwner}/${this._serverName}`,{method:"PATCH",headers:{Authorization:`token ${this._token}`},body:JSON.stringify({[t]:e.name})})}_populateBody(e){const t=document.createElement("div");t.classList.add("jp-ManageSharesBody-search-container"),this._searchInput=document.createElement("input"),this._searchInput.type="text",this._searchInput.classList.add("jp-ManageSharesBody-search-input"),this._searchInput.placeholder=this._trans.__("Type to search for a user or a group to share your server with..."),this._searchInput.addEventListener("input",(()=>{this._updateSearchResults()})),t.appendChild(this._searchInput),e.appendChild(t),this._searchResults=document.createElement("div"),this._searchResults.classList.add("jp-ManageSharesBody-search-results"),e.appendChild(this._searchResults),this._sharesContainer=document.createElement("div"),this._sharesContainer.classList.add("jp-ManageSharesBody-selected-users"),e.appendChild(this._sharesContainer);const s=document.createElement("input");s.classList.add("jp-ManageSharesBody-url-input"),s.readOnly=!0,s.value=this._url,e.appendChild(s),e.insertAdjacentHTML("beforeend","<br>"),e.insertAdjacentText("beforeend",this._trans.__("Warning: Anyone you share this server with will have access to all your files, not just the currently open file.")),e.insertAdjacentHTML("beforeend","<br>"),e.insertAdjacentText("beforeend",this._trans.__("If your Hub administrator allows it, you can create another server dedicated to sharing a specific project."))}_updateSearchResults(){var e;if(!this._searchResults)return;this._searchResults.innerHTML="";const t=(null===(e=this._searchInput)||void 0===e?void 0:e.value)||"";this._recipients.filter((e=>e.name.toLowerCase().includes(t.toLowerCase())||""===t)).forEach((e=>{var t;const s=document.createElement("div");s.classList.add("jp-ManageSharesBody-user-item"),"group"===e.type?s.textContent=this._trans.__("Group %1",e.name):s.textContent=e.name,s.addEventListener("click",(async()=>{await this._createShare(e,e.type),await this._loadShares(),await this._updateSharesList();const t=new Set(this._shares.map((e=>e.name)));this._recipients=this._recipients.filter((e=>e.name!==this._serverOwner&&!t.has(e.name))),this._updateSearchResults()})),null===(t=this._searchResults)||void 0===t||t.appendChild(s)}))}async _updateSharesList(){if(!this._sharesContainer)return;this._sharesContainer.innerHTML="";const e=document.createElement("table");e.classList.add("jp-ManageSharesBody-shares-table");const t=document.createElement("tr"),s=document.createElement("th");s.textContent=this._trans.__("Shared with");const n=document.createElement("th");n.textContent=this._trans.__("Shared since");const r=document.createElement("th");if(r.textContent=this._trans.__("Actions"),t.appendChild(s),t.appendChild(n),t.appendChild(r),e.appendChild(t),0===this._shares.length){const t=document.createElement("tr"),s=document.createElement("td");s.colSpan=3,s.textContent=this._trans.__("Your server is not shared to anybody yet. You can search for users and groups above."),t.appendChild(s),e.appendChild(t)}else this._shares.forEach((t=>{const s=document.createElement("tr"),n=document.createElement("td");"group"===t.type?n.textContent=this._trans.__("Group %1",t.name):n.textContent=t.name,s.appendChild(n);const r=document.createElement("td"),a=new Date(t.createdAt).toLocaleString([],{hour:"2-digit",minute:"2-digit",year:"numeric",month:"2-digit",day:"2-digit"});r.textContent=a,s.appendChild(r);const i=document.createElement("td"),o=document.createElement("button");o.textContent=this._trans.__("Revoke"),o.classList.add("jp-mod-styled"),o.addEventListener("click",(async()=>{await this._deleteShare(t,t.type),await this._loadShares(),await this._updateSharesList(),await this._loadUsers();const e=new Set(this._shares.map((e=>e.name)));this._recipients=this._recipients.filter((t=>t.name!==this._serverOwner&&!e.has(t.name))),this._updateSearchResults()})),i.appendChild(o),s.appendChild(i),e.appendChild(s)}));this._sharesContainer.appendChild(e)}}class F extends l.Widget{constructor(e,t,s,n){super(),this._url=e,this._token=t,this._behindHub=s,this._trans=n,this._tokenCheckbox=null,this._onTokenChange=e=>{const t=e.target;this._updateContent(null==t?void 0:t.checked)},this._warning=document.createElement("div"),this._populateBody(this.node),this.addClass("jp-shared-link-body")}getValue(){var e;if(!0===(null===(e=this._tokenCheckbox)||void 0===e?void 0:e.checked)){const e=new URL(this._url);return e.searchParams.set("token",this._token),e.toString()}return this._url}onAfterAttach(e){var t;super.onAfterAttach(e),null===(t=this._tokenCheckbox)||void 0===t||t.addEventListener("change",this._onTokenChange)}onBeforeDetach(e){var t;null===(t=this._tokenCheckbox)||void 0===t||t.removeEventListener("change",this._onTokenChange),super.onBeforeDetach(e)}_updateContent(e){this._warning.innerHTML="";const t=this.node.querySelector("input[readonly]");if(e){if(t){const e=new URL(this._url);e.searchParams.set("token",this._token.slice(0,5)),t.value=e.toString()+"…"}this._warning.appendChild(document.createElement("h3")).textContent=this._trans.__("Security warning!"),this._warning.insertAdjacentText("beforeend",this._trans.__("Anyone with this link has full access to your notebook server, including all your files!")),this._warning.insertAdjacentHTML("beforeend","<br>"),this._warning.insertAdjacentText("beforeend",this._trans.__("Please be careful who you share it with.")),this._warning.insertAdjacentHTML("beforeend","<br>"),this._behindHub?(this._warning.insertAdjacentText("beforeend",this._trans.__("They will be able to access this server AS YOU.")),this._warning.insertAdjacentHTML("beforeend","<br>"),this._warning.insertAdjacentText("beforeend",this._trans.__("To revoke access, go to File -> Hub Control Panel, and restart your server."))):this._warning.insertAdjacentText("beforeend",this._trans.__("Currently, there is no way to revoke access other than shutting down your server."))}else t&&(t.value=this._url),this._behindHub?this._warning.insertAdjacentText("beforeend",this._trans.__("Only users with `access:servers` permissions for this server will be able to use this link.")):this._warning.insertAdjacentText("beforeend",this._trans.__("Only authenticated users will be able to use this link."))}_populateBody(e){const t=document.createElement("input");if(t.readOnly=!0,t.value=this._url,e.appendChild(t),this._token){const t=e.appendChild(document.createElement("label"));t.insertAdjacentHTML("beforeend",'<input type="checkbox">'),this._tokenCheckbox=t.firstChild,t.insertAdjacentText("beforeend",this._trans.__("Include token in URL")),e.insertAdjacentElement("beforeend",this._warning),this._updateContent(!1)}}}var H=s(1125);function W(e){const{userManager:t,onClick:s}=e,[n,r]=(0,c.useState)(t.identity);return(0,c.useEffect)((()=>{const e=()=>{r(t.identity)};return t.userChanged.connect(e),()=>{t.userChanged.disconnect(e)}}),[t]),d().createElement("div",{title:n.display_name,className:"jp-UserInfo-Icon",style:{backgroundColor:n.color},onClick:s},d().createElement("span",null,n.initials))}class J extends i.ReactWidget{constructor(e){super(),this._onChange=(e,t)=>{var s;const n=(null===(s=this._userManager.permissions)||void 0===s?void 0:s.updatable_fields)||[];(null==n?void 0:n.includes(t))&&(this._userUpdate[t]=e.target.value)},this._userUpdate={},this._userManager=e.userManager}getValue(){return this._userUpdate}render(){var e;const t=this._userManager.identity;if(!t)return d().createElement("div",{className:"jp-UserInfo-Details"},"Error loading user info");const s=(null===(e=this._userManager.permissions)||void 0===e?void 0:e.updatable_fields)||[];return d().createElement("div",{className:"jp-UserInfo-Details"},Object.keys(t).map((e=>{const n=`jp-UserInfo-Value-${e}`;return d().createElement("div",{key:e,className:"jp-UserInfo-Field"},d().createElement("label",{htmlFor:n},e),d().createElement("input",{type:"text",name:e,id:n,onInput:t=>this._onChange(t,e),defaultValue:t[e],disabled:!(null==s?void 0:s.includes(e))}))})))}}class z extends l.Panel{constructor(e){super({}),this.addClass("jp-UserInfoPanel"),this._profile=e.userManager,this._serverSettings=e.serverSettings,this._body=null,this._profile.isReady?(this._body=new V({userManager:this._profile,serverSettings:this._serverSettings,trans:e.trans}),this.addWidget(this._body),this.update()):this._profile.ready.then((()=>{this._body=new V({userManager:this._profile,serverSettings:this._serverSettings,trans:e.trans}),this.addWidget(this._body),this.update()})).catch((e=>console.error(e)))}}class V extends a.ReactWidget{constructor(e){var t;super(),this.onClick=()=>{this._userManager.identity&&(0,a.showDialog)({body:new J({userManager:this._userManager}),title:this._trans.__("User Details")}).then((async e=>{if(e.button.accept)try{const t=T.URLExt.join(this._serverSettings.baseUrl,"/api/me"),s={method:"PATCH",body:JSON.stringify(e.value)};let n;try{n=await H.ServerConnection.makeRequest(t,s,this._serverSettings)}catch(e){throw new H.ServerConnection.NetworkError(e)}if(!n.ok){const e=this._trans.__("Failed to update user data");throw new Error(e)}this._userManager.refreshUser()}catch(e){console.error(e)}}))},this._userManager=e.userManager,this._serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:H.ServerConnection.makeSettings(),this._trans=e.trans}get user(){return this._userManager}set user(e){this._userManager=e,this.update()}render(){return c.createElement("div",{className:"jp-UserInfo-Container"},c.createElement(W,{userManager:this._userManager,onClick:this.onClick}))}}class q extends c.Component{constructor(e){var t;super(e),this._awarenessChange=()=>{var e;const t=null===(e=this._model)||void 0===e?void 0:e.sharedModel.awareness.getStates(),s=[];t&&t.forEach(((e,t)=>{e.user&&s.push({userId:t,userData:e.user})})),this.setState((e=>({...e,usersList:s})))},this._model=e.model,this._iconRenderer=null!==(t=e.iconRenderer)&&void 0!==t?t:null,this.state={usersList:[]}}static createWidget(e){return i.ReactWidget.create(c.createElement(q,{...e}))}componentDidMount(){var e;null===(e=this._model)||void 0===e||e.sharedModel.awareness.on("change",this._awarenessChange),this._awarenessChange()}filterDuplicated(e){var t;const s=[],n=new Set;for(const r of e)(null===(t=null==r?void 0:r.userData)||void 0===t?void 0:t.username)&&!n.has(r.userData.username)&&(n.add(r.userData.username),s.push(r));return s}render(){var e;const t=null!==(e=this._iconRenderer)&&void 0!==e?e:G;return c.createElement("div",{className:"jp-toolbar-users-item"},this.filterDuplicated(this.state.usersList).map((e=>{if(this._model&&e.userId!==this._model.sharedModel.awareness.clientID)return t({user:e,model:this._model})})))}}function G(e){let t;const{user:s,model:n,...r}=e,a=(0,i.classes)("lm-MenuBar-itemIcon",e.className||"");return t=s.userData.avatar_url?c.createElement("div",{...r,key:s.userId,title:s.userData.display_name,className:(0,i.classes)(a,"jp-MenuBar-imageIcon")},c.createElement("img",{src:s.userData.avatar_url,alt:""})):c.createElement("div",{...r,key:s.userId,title:s.userData.display_name,className:(0,i.classes)(a,"jp-MenuBar-anonymousIcon"),style:{backgroundColor:s.userData.color}},c.createElement("span",null,s.userData.initials)),t}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_jupyter_collaboration_extension=self.webpackChunk_jupyter_collaboration_extension||[]).push([[842],{4842:(e,r,a)=>{a.r(r),a.d(r,{default:()=>x});var t=a(5285),n=a(3790),o=a(5627),s=a(7591),i=a(3391),l=a(4526),c=a(1125),d=a(8085),u=a(769),p=a(1247),m=a(5179),b=a(2206),v=a(7784);const y={id:"@jupyter/collaboration-extension:userMenu",description:"Provide connected user menu.",requires:[],provides:m.IUserMenu,activate:e=>{const{commands:r}=e,{user:a}=e.serviceManager;return new m.UserMenu({commands:r,user:a})}},w={id:"@jupyter/collaboration-extension:user-menu-bar",description:"Add user menu to the interface.",autoStart:!0,requires:[m.IUserMenu,t.IToolbarWidgetRegistry],activate:async(e,r,a)=>{const{user:t}=e.serviceManager,n=new p.MenuBar({forceItemsPosition:{forceX:!1,forceY:!1},renderer:new m.RendererUserMenu(t)});n.id="jp-UserMenu",t.userChanged.connect((()=>n.update())),n.addMenu(r),a.addFactory("TopBar","user-menu",(()=>n))}},g={id:"@jupyter/collaboration-extension:rtcGlobalAwareness",description:"Add global awareness to share working document of users.",requires:[d.IStateDB],provides:o.IGlobalAwareness,activate:(e,r)=>{var a;const{user:t}=e.serviceManager,n=new b.Doc,o=new v.ww(n),i=null!==(a=e.serviceManager.serverSettings)&&void 0!==a?a:c.ServerConnection.makeSettings(),d=l.URLExt.join(i.wsUrl,"api/collaboration/room");return new s.WebSocketAwarenessProvider({url:d,roomID:"JupyterLab:globalAwareness",awareness:o,user:t}),r.changed.connect((async()=>{var e,a;const t=(null===(a=null===(e=(await r.toJSON())["layout-restorer:data"])||void 0===e?void 0:e.main)||void 0===a?void 0:a.current)||"";t.match(/^\w+:.+/)?o.setLocalStateField("current",t):o.setLocalStateField("current",null)})),o}},h={id:"@jupyter/collaboration-extension:rtcPanel",description:"Add side panel to display all currently connected users.",autoStart:!0,requires:[o.IGlobalAwareness],optional:[u.ITranslator],activate:(e,r,a)=>{const{user:t}=e.serviceManager,n=(null!=a?a:u.nullTranslator).load("jupyter_collaboration"),o=new i.SidePanel({alignment:"justify"});o.id="jp-collaboration-panel",o.title.icon=i.usersIcon,o.title.caption=n.__("Collaboration"),o.addClass("jp-RTCPanel"),e.shell.add(o,"left",{rank:300});const s=new m.UserInfoPanel({userManager:t,serverSettings:e.serviceManager.serverSettings,trans:n});s.title.label=n.__("User info"),s.title.caption=n.__("User information"),o.addWidget(s);const l=new m.CollaboratorsPanel(t,r,(r=>{e.commands.execute("docmanager:open",{path:r})}),e.docRegistry);l.title.label=n.__("Online Collaborators"),o.addWidget(l)}},_={id:"@jupyter/collaboration-extension:userEditorCursors",description:"Add CodeMirror extension to display remote user cursors and selections.",autoStart:!0,requires:[n.IEditorExtensionRegistry],activate:(e,r)=>{r.addExtension({name:"remote-user-cursors",factory(e){const{awareness:r,ysource:a}=e.model.sharedModel;return n.EditorExtensionRegistry.createImmutableExtension((0,m.remoteUserCursors)({awareness:r,ytext:a}))}})}};var S;!function(e){e.share="collaboration:shared-link"}(S||(S={}));const x=[y,w,g,h,{id:"@jupyter/collaboration-extension:shared-link",autoStart:!0,optional:[t.ICommandPalette,u.ITranslator],activate:async(e,r,a)=>{const{commands:n}=e,o=(null!=a?a:u.nullTranslator).load("jupyter_collaboration");n.addCommand(S.share,{label:o.__("Generate a Shared Link"),icon:i.shareIcon,execute:async()=>{const e=await(0,m.showSharedLinkDialog)({translator:a});e.button.accept&&e.value&&t.Clipboard.copyToSystem(e.value)}}),r&&r.addItem({command:S.share,category:o.__("Server")})}},_]}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var _JUPYTERLAB;(()=>{"use strict";var e,r,t,o,a,n,i,l,u,s,f,d,c,p,b,h,v,m,y,g,j,w,P,S={1998:(e,r,t)=>{var o={"./index":()=>Promise.all([t.e(422),t.e(784),t.e(206),t.e(614),t.e(247),t.e(200),t.e(842)]).then((()=>()=>t(4842))),"./extension":()=>Promise.all([t.e(422),t.e(784),t.e(206),t.e(614),t.e(247),t.e(200),t.e(842)]).then((()=>()=>t(4842))),"./style":()=>t.e(944).then((()=>()=>t(5944)))},a=(e,r)=>(t.R=r,r=t.o(o,e)?o[e]():Promise.resolve().then((()=>{throw new Error('Module "'+e+'" does not exist in container.')})),t.R=void 0,r),n=(e,r)=>{if(t.S){var o="default",a=t.S[o];if(a&&a!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[o]=e,t.I(o,r)}};t.d(r,{get:()=>a,init:()=>n})}},k={};function x(e){var r=k[e];if(void 0!==r)return r.exports;var t=k[e]={id:e,exports:{}};return S[e](t,t.exports,x),t.exports}x.m=S,x.c=k,x.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return x.d(r,{a:r}),r},x.d=(e,r)=>{for(var t in r)x.o(r,t)&&!x.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},x.f={},x.e=e=>Promise.all(Object.keys(x.f).reduce(((r,t)=>(x.f[t](e,r),r)),[])),x.u=e=>e+"."+{240:"dd38b925e1faeb907a84",393:"4d70605d766485df5d02",422:"c33fd4bf2f8b13b1f430",444:"d6f3cc1c6d4b374efa63",784:"586f70cab201cb43c954",842:"3ee3a54baf126527c584",944:"27191c0195c19b79d6b0",952:"8934cdeb03f9bd1e666f"}[e]+".js?v="+{240:"dd38b925e1faeb907a84",393:"4d70605d766485df5d02",422:"c33fd4bf2f8b13b1f430",444:"d6f3cc1c6d4b374efa63",784:"586f70cab201cb43c954",842:"3ee3a54baf126527c584",944:"27191c0195c19b79d6b0",952:"8934cdeb03f9bd1e666f"}[e],x.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),x.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="@jupyter/collaboration-extension:",x.l=(t,o,a,n)=>{if(e[t])e[t].push(o);else{var i,l;if(void 0!==a)for(var u=document.getElementsByTagName("script"),s=0;s<u.length;s++){var f=u[s];if(f.getAttribute("src")==t||f.getAttribute("data-webpack")==r+a){i=f;break}}i||(l=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,x.nc&&i.setAttribute("nonce",x.nc),i.setAttribute("data-webpack",r+a),i.src=t),e[t]=[o];var d=(r,o)=>{i.onerror=i.onload=null,clearTimeout(c);var a=e[t];if(delete e[t],i.parentNode&&i.parentNode.removeChild(i),a&&a.forEach((e=>e(o))),r)return r(o)},c=setTimeout(d.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=d.bind(null,i.onerror),i.onload=d.bind(null,i.onload),l&&document.head.appendChild(i)}},x.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{x.S={};var e={},r={};x.I=(t,o)=>{o||(o=[]);var a=r[t];if(a||(a=r[t]={}),!(o.indexOf(a)>=0)){if(o.push(a),e[t])return e[t];x.o(x.S,t)||(x.S[t]={});var n=x.S[t],i="@jupyter/collaboration-extension",l=(e,r,t,o)=>{var a=n[e]=n[e]||{},l=a[r];(!l||!l.loaded&&(!o!=!l.eager?o:i>l.from))&&(a[r]={get:t,from:i,eager:!!o})},u=[];return"default"===t&&(l("@jupyter/collaboration-extension","4.2.1",(()=>Promise.all([x.e(422),x.e(784),x.e(206),x.e(614),x.e(247),x.e(200),x.e(842)]).then((()=>()=>x(4842))))),l("@jupyter/collaboration","4.2.1",(()=>Promise.all([x.e(206),x.e(262),x.e(614),x.e(312),x.e(247),x.e(393)]).then((()=>()=>x(6393))))),l("@jupyter/collaborative-drive","4.2.1",(()=>Promise.all([x.e(262),x.e(444)]).then((()=>()=>x(444))))),l("@jupyter/docprovider","4.2.1",(()=>Promise.all([x.e(422),x.e(262),x.e(614),x.e(312),x.e(240)]).then((()=>()=>x(6240))))),l("y-websocket","1.5.4",(()=>Promise.all([x.e(422),x.e(784),x.e(952),x.e(206)]).then((()=>()=>x(2952)))))),e[t]=u.length?Promise.all(u).then((()=>e[t]=1)):1}}})(),(()=>{var e;x.g.importScripts&&(e=x.g.location+"");var r=x.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=t[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),x.p=e})(),t=e=>{var r=e=>e.split(".").map((e=>+e==e?+e:e)),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),o=t[1]?r(t[1]):[];return t[2]&&(o.length++,o.push.apply(o,r(t[2]))),t[3]&&(o.push([]),o.push.apply(o,r(t[3]))),o},o=(e,r)=>{e=t(e),r=t(r);for(var o=0;;){if(o>=e.length)return o<r.length&&"u"!=(typeof r[o])[0];var a=e[o],n=(typeof a)[0];if(o>=r.length)return"u"==n;var i=r[o],l=(typeof i)[0];if(n!=l)return"o"==n&&"n"==l||"s"==l||"u"==n;if("o"!=n&&"u"!=n&&a!=i)return a<i;o++}},a=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var o=1,n=1;n<e.length;n++)o--,t+="u"==(typeof(l=e[n]))[0]?"-":(o>0?".":"")+(o=2,l);return t}var i=[];for(n=1;n<e.length;n++){var l=e[n];i.push(0===l?"not("+u()+")":1===l?"("+u()+" || "+u()+")":2===l?i.pop()+" "+i.pop():a(l))}return u();function u(){return i.pop().replace(/^\((.+)\)$/,"$1")}},n=(e,r)=>{if(0 in e){r=t(r);var o=e[0],a=o<0;a&&(o=-o-1);for(var i=0,l=1,u=!0;;l++,i++){var s,f,d=l<e.length?(typeof e[l])[0]:"";if(i>=r.length||"o"==(f=(typeof(s=r[i]))[0]))return!u||("u"==d?l>o&&!a:""==d!=a);if("u"==f){if(!u||"u"!=d)return!1}else if(u)if(d==f)if(l<=o){if(s!=e[l])return!1}else{if(a?s>e[l]:s<e[l])return!1;s!=e[l]&&(u=!1)}else if("s"!=d&&"n"!=d){if(a||l<=o)return!1;u=!1,l--}else{if(l<=o||f<d!=a)return!1;u=!1}else"s"!=d&&"n"!=d&&(u=!1,l--)}}var c=[],p=c.pop.bind(c);for(i=1;i<e.length;i++){var b=e[i];c.push(1==b?p()|p():2==b?p()&p():b?n(b,r):!p())}return!!p()},i=(e,r)=>e&&x.o(e,r),l=e=>(e.loaded=1,e.get()),u=e=>Object.keys(e).reduce(((r,t)=>(e[t].eager&&(r[t]=e[t]),r)),{}),s=(e,r,t,a)=>{var i=a?u(e[r]):e[r];return(r=Object.keys(i).reduce(((e,r)=>!n(t,r)||e&&!o(e,r)?e:r),0))&&i[r]},f=(e,r,t)=>{var a=t?u(e[r]):e[r];return Object.keys(a).reduce(((e,r)=>!e||!a[e].loaded&&o(e,r)?r:e),0)},d=(e,r,t,o)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+a(o)+")",c=(e,r,t,o,n)=>{var i=e[t];return"No satisfying version ("+a(o)+")"+(n?" for eager consumption":"")+" of shared module "+t+" found in shared scope "+r+".\nAvailable versions: "+Object.keys(i).map((e=>e+" from "+i[e].from)).join(", ")},p=e=>{throw new Error(e)},b=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},v=(e,r,t)=>t?t():((e,r)=>p("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),m=(h=e=>function(r,t,o,a,n){var i=x.I(r);return i&&i.then&&!o?i.then(e.bind(e,r,x.S[r],t,!1,a,n)):e(r,x.S[r],t,o,a,n)})(((e,r,t,o,a,n)=>{if(!i(r,t))return v(e,t,n);var u=s(r,t,a,o);return u?l(u):n?n():void p(c(r,e,t,a,o))})),y=h(((e,r,t,o,a,u)=>{if(!i(r,t))return v(e,t,u);var s=f(r,t,o);return n(a,s)||b(d(r,t,s,a)),l(r[t][s])})),g={},j={2206:()=>y("default","yjs",!1,[1,13,5,40]),769:()=>y("default","@jupyterlab/translation",!1,[1,4,5,3]),1125:()=>y("default","@jupyterlab/services",!1,[1,7,5,3]),3391:()=>y("default","@jupyterlab/ui-components",!1,[1,4,5,3]),4526:()=>y("default","@jupyterlab/coreutils",!1,[1,6,5,3]),5285:()=>y("default","@jupyterlab/apputils",!1,[1,4,6,3]),1247:()=>y("default","@lumino/widgets",!1,[1,2,3,1,,"alpha",1]),3790:()=>y("default","@jupyterlab/codemirror",!1,[1,4,5,3]),5179:()=>y("default","@jupyter/collaboration",!1,[1,4,2,1],(()=>Promise.all([x.e(262),x.e(312),x.e(393)]).then((()=>()=>x(6393))))),5627:()=>y("default","@jupyter/collaborative-drive",!1,[1,4,2,1],(()=>Promise.all([x.e(262),x.e(444)]).then((()=>()=>x(444))))),7591:()=>y("default","@jupyter/docprovider",!1,[1,4,2,1],(()=>Promise.all([x.e(262),x.e(312),x.e(240)]).then((()=>()=>x(6240))))),8085:()=>y("default","@jupyterlab/statedb",!1,[1,4,5,3]),7262:()=>y("default","@lumino/coreutils",!1,[1,2,0,0]),3345:()=>y("default","react",!1,[1,18,2,0]),4602:()=>y("default","@lumino/signaling",!1,[1,2,0,0]),195:()=>y("default","@codemirror/state",!1,[1,6,2,0]),4873:()=>y("default","@lumino/virtualdom",!1,[1,2,0,0]),5024:()=>y("default","@codemirror/view",!1,[1,6,9,6]),3560:()=>m("default","y-websocket",!1,[1,1,3,15],(()=>Promise.all([x.e(784),x.e(952),x.e(206)]).then((()=>()=>x(2952)))))},w={200:[3790,5179,5627,7591,8085],206:[2206],240:[3560],247:[1247],262:[7262],312:[3345,4602],393:[195,4873,5024],614:[769,1125,3391,4526,5285]},P={},x.f.consumes=(e,r)=>{x.o(w,e)&&w[e].forEach((e=>{if(x.o(g,e))return r.push(g[e]);if(!P[e]){var t=r=>{g[e]=0,x.m[e]=t=>{delete x.c[e],t.exports=r()}};P[e]=!0;var o=r=>{delete g[e],x.m[e]=t=>{throw delete x.c[e],r}};try{var a=j[e]();a.then?r.push(g[e]=a.then(t).catch(o)):t(a)}catch(e){o(e)}}}))},(()=>{var e={270:0};x.f.j=(r,t)=>{var o=x.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else if(/^(2(00|06|47|62)|312|614)$/.test(r))e[r]=0;else{var a=new Promise(((t,a)=>o=e[r]=[t,a]));t.push(o[2]=a);var n=x.p+x.u(r),i=new Error;x.l(n,(t=>{if(x.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var a=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+a+": "+n+")",i.name="ChunkLoadError",i.type=a,i.request=n,o[1](i)}}),"chunk-"+r,r)}};var r=(r,t)=>{var o,a,[n,i,l]=t,u=0;if(n.some((r=>0!==e[r]))){for(o in i)x.o(i,o)&&(x.m[o]=i[o]);l&&l(x)}for(r&&r(t);u<n.length;u++)a=n[u],x.o(e,a)&&e[a]&&e[a][0](),e[a]=0},t=self.webpackChunk_jupyter_collaboration_extension=self.webpackChunk_jupyter_collaboration_extension||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),x.nc=void 0;var E=x(1998);(_JUPYTERLAB=void 0===_JUPYTERLAB?{}:_JUPYTERLAB)["@jupyter/collaboration-extension"]=E})();
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
"packages": [
|
|
3
3
|
{
|
|
4
4
|
"name": "@jupyter/collaboration",
|
|
5
|
-
"versionInfo": "4.2.
|
|
5
|
+
"versionInfo": "4.2.1",
|
|
6
6
|
"licenseId": "BSD-3-Clause",
|
|
7
7
|
"extractedText": ""
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
"name": "@jupyter/collaborative-drive",
|
|
11
|
-
"versionInfo": "4.2.
|
|
11
|
+
"versionInfo": "4.2.1",
|
|
12
12
|
"licenseId": "BSD-3-Clause",
|
|
13
13
|
"extractedText": ""
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"name": "@jupyter/docprovider",
|
|
17
|
-
"versionInfo": "4.2.
|
|
17
|
+
"versionInfo": "4.2.1",
|
|
18
18
|
"licenseId": "BSD-3-Clause",
|
|
19
19
|
"extractedText": ""
|
|
20
20
|
},
|
|
@@ -20,22 +20,26 @@ import { UserDetailsBody, UserIconComponent } from './components';
|
|
|
20
20
|
*/
|
|
21
21
|
type UserInfoProps = {
|
|
22
22
|
userManager: User.IManager;
|
|
23
|
+
serverSettings?: ServerConnection.ISettings;
|
|
23
24
|
trans: IRenderMime.TranslationBundle;
|
|
24
25
|
};
|
|
25
26
|
|
|
26
27
|
export class UserInfoPanel extends Panel {
|
|
27
28
|
private _profile: User.IManager;
|
|
29
|
+
private _serverSettings?: ServerConnection.ISettings;
|
|
28
30
|
private _body: UserInfoBody | null;
|
|
29
31
|
|
|
30
32
|
constructor(options: UserInfoProps) {
|
|
31
33
|
super({});
|
|
32
34
|
this.addClass('jp-UserInfoPanel');
|
|
33
35
|
this._profile = options.userManager;
|
|
36
|
+
this._serverSettings = options.serverSettings;
|
|
34
37
|
this._body = null;
|
|
35
38
|
|
|
36
39
|
if (this._profile.isReady) {
|
|
37
40
|
this._body = new UserInfoBody({
|
|
38
41
|
userManager: this._profile,
|
|
42
|
+
serverSettings: this._serverSettings,
|
|
39
43
|
trans: options.trans
|
|
40
44
|
});
|
|
41
45
|
this.addWidget(this._body);
|
|
@@ -45,6 +49,7 @@ export class UserInfoPanel extends Panel {
|
|
|
45
49
|
.then(() => {
|
|
46
50
|
this._body = new UserInfoBody({
|
|
47
51
|
userManager: this._profile,
|
|
52
|
+
serverSettings: this._serverSettings,
|
|
48
53
|
trans: options.trans
|
|
49
54
|
});
|
|
50
55
|
this.addWidget(this._body);
|
|
@@ -63,6 +68,7 @@ export class UserInfoBody
|
|
|
63
68
|
implements Dialog.IBodyWidget<User.IManager>
|
|
64
69
|
{
|
|
65
70
|
private _userManager: User.IManager;
|
|
71
|
+
private _serverSettings: ServerConnection.ISettings;
|
|
66
72
|
private _trans: IRenderMime.TranslationBundle;
|
|
67
73
|
/**
|
|
68
74
|
* Constructs a new settings widget.
|
|
@@ -70,6 +76,8 @@ export class UserInfoBody
|
|
|
70
76
|
constructor(props: UserInfoProps) {
|
|
71
77
|
super();
|
|
72
78
|
this._userManager = props.userManager;
|
|
79
|
+
this._serverSettings =
|
|
80
|
+
props.serverSettings ?? ServerConnection.makeSettings();
|
|
73
81
|
this._trans = props.trans;
|
|
74
82
|
}
|
|
75
83
|
|
|
@@ -95,8 +103,7 @@ export class UserInfoBody
|
|
|
95
103
|
if (result.button.accept) {
|
|
96
104
|
// Call the Jupyter Server API to update the user field
|
|
97
105
|
try {
|
|
98
|
-
const
|
|
99
|
-
const url = URLExt.join(settings.baseUrl, '/api/me');
|
|
106
|
+
const url = URLExt.join(this._serverSettings.baseUrl, '/api/me');
|
|
100
107
|
const body = {
|
|
101
108
|
method: 'PATCH',
|
|
102
109
|
body: JSON.stringify(result.value)
|
|
@@ -104,7 +111,11 @@ export class UserInfoBody
|
|
|
104
111
|
|
|
105
112
|
let response: Response;
|
|
106
113
|
try {
|
|
107
|
-
response = await ServerConnection.makeRequest(
|
|
114
|
+
response = await ServerConnection.makeRequest(
|
|
115
|
+
url,
|
|
116
|
+
body,
|
|
117
|
+
this._serverSettings
|
|
118
|
+
);
|
|
108
119
|
} catch (error) {
|
|
109
120
|
throw new ServerConnection.NetworkError(error as Error);
|
|
110
121
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupyter/collaboration-extension",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.1",
|
|
4
4
|
"description": "JupyterLab - Real-Time Collaboration Extension",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jupyter",
|
|
@@ -53,9 +53,9 @@
|
|
|
53
53
|
"watch:labextension": "jupyter labextension watch ."
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@jupyter/collaboration": "^4.2.
|
|
57
|
-
"@jupyter/collaborative-drive": "^4.2.
|
|
58
|
-
"@jupyter/docprovider": "^4.2.
|
|
56
|
+
"@jupyter/collaboration": "^4.2.1",
|
|
57
|
+
"@jupyter/collaborative-drive": "^4.2.1",
|
|
58
|
+
"@jupyter/docprovider": "^4.2.1",
|
|
59
59
|
"@jupyter/ydoc": "^2.1.3 || ^3.0.0",
|
|
60
60
|
"@jupyterlab/application": "^4.5.0",
|
|
61
61
|
"@jupyterlab/apputils": "^4.5.0",
|
|
@@ -97,7 +97,8 @@ export const rtcGlobalAwarenessPlugin: JupyterFrontEndPlugin<IAwareness> = {
|
|
|
97
97
|
const ydoc = new Y.Doc();
|
|
98
98
|
const awareness = new Awareness(ydoc);
|
|
99
99
|
|
|
100
|
-
const server =
|
|
100
|
+
const server =
|
|
101
|
+
app.serviceManager.serverSettings ?? ServerConnection.makeSettings();
|
|
101
102
|
const url = URLExt.join(server.wsUrl, 'api/collaboration/room');
|
|
102
103
|
|
|
103
104
|
new WebSocketAwarenessProvider({
|
|
@@ -153,6 +154,7 @@ export const rtcPanelPlugin: JupyterFrontEndPlugin<void> = {
|
|
|
153
154
|
|
|
154
155
|
const currentUserPanel = new UserInfoPanel({
|
|
155
156
|
userManager: user,
|
|
157
|
+
serverSettings: app.serviceManager.serverSettings,
|
|
156
158
|
trans
|
|
157
159
|
});
|
|
158
160
|
currentUserPanel.title.label = trans.__('User info');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupyter/docprovider",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.1",
|
|
4
4
|
"description": "JupyterLab - Document Provider",
|
|
5
5
|
"homepage": "https://github.com/jupyterlab/jupyter-collaboration",
|
|
6
6
|
"bugs": {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"watch": "tsc -b --watch"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@jupyter/collaborative-drive": "^4.2.
|
|
44
|
+
"@jupyter/collaborative-drive": "^4.2.1",
|
|
45
45
|
"@jupyter/ydoc": "^2.1.3 || ^3.0.0",
|
|
46
46
|
"@jupyterlab/apputils": "^4.5.0",
|
|
47
47
|
"@jupyterlab/cells": "^4.5.0",
|
|
@@ -7,6 +7,7 @@ import { ReactWidget } from '@jupyterlab/apputils';
|
|
|
7
7
|
import { TimelineSliderComponent } from './component';
|
|
8
8
|
import * as React from 'react';
|
|
9
9
|
import { IForkProvider } from './ydrive';
|
|
10
|
+
import { ServerConnection } from '@jupyterlab/services';
|
|
10
11
|
|
|
11
12
|
export class TimelineWidget extends ReactWidget {
|
|
12
13
|
private apiURL: string;
|
|
@@ -14,13 +15,15 @@ export class TimelineWidget extends ReactWidget {
|
|
|
14
15
|
private contentType: string;
|
|
15
16
|
private format: string;
|
|
16
17
|
private documentTimelineUrl: string;
|
|
18
|
+
private _serverSettings?: ServerConnection.ISettings;
|
|
17
19
|
|
|
18
20
|
constructor(
|
|
19
21
|
apiURL: string,
|
|
20
22
|
provider: IForkProvider,
|
|
21
23
|
contentType: string,
|
|
22
24
|
format: string,
|
|
23
|
-
documentTimelineUrl: string
|
|
25
|
+
documentTimelineUrl: string,
|
|
26
|
+
serverSettings?: ServerConnection.ISettings
|
|
24
27
|
) {
|
|
25
28
|
super();
|
|
26
29
|
this.apiURL = apiURL;
|
|
@@ -28,6 +31,7 @@ export class TimelineWidget extends ReactWidget {
|
|
|
28
31
|
this.contentType = contentType;
|
|
29
32
|
this.format = format;
|
|
30
33
|
this.documentTimelineUrl = documentTimelineUrl;
|
|
34
|
+
this._serverSettings = serverSettings;
|
|
31
35
|
this.addClass('jp-timelineSliderWrapper');
|
|
32
36
|
}
|
|
33
37
|
|
|
@@ -40,6 +44,7 @@ export class TimelineWidget extends ReactWidget {
|
|
|
40
44
|
contentType={this.contentType}
|
|
41
45
|
format={this.format}
|
|
42
46
|
documentTimelineUrl={this.documentTimelineUrl}
|
|
47
|
+
serverSettings={this._serverSettings}
|
|
43
48
|
/>
|
|
44
49
|
);
|
|
45
50
|
}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
ForkManager,
|
|
7
7
|
JUPYTER_COLLABORATION_FORK_EVENTS_URI
|
|
8
8
|
} from '../forkManager';
|
|
9
|
-
import { Event } from '@jupyterlab/services';
|
|
9
|
+
import { Event, ServerConnection } from '@jupyterlab/services';
|
|
10
10
|
import { Signal } from '@lumino/signaling';
|
|
11
11
|
import { requestAPI } from '../requests';
|
|
12
12
|
jest.mock('../requests');
|
|
@@ -18,13 +18,15 @@ const stream = new Signal({});
|
|
|
18
18
|
const eventManagerMock = {
|
|
19
19
|
stream: stream as any
|
|
20
20
|
} as Event.IManager;
|
|
21
|
+
const serverSettingsMock = {} as ServerConnection.ISettings;
|
|
21
22
|
|
|
22
23
|
describe('@jupyter/docprovider', () => {
|
|
23
24
|
let manager: ForkManager;
|
|
24
25
|
beforeEach(() => {
|
|
25
26
|
manager = new ForkManager({
|
|
26
27
|
contentProvider: contentProviderMock,
|
|
27
|
-
eventManager: eventManagerMock
|
|
28
|
+
eventManager: eventManagerMock,
|
|
29
|
+
serverSettings: serverSettingsMock
|
|
28
30
|
});
|
|
29
31
|
});
|
|
30
32
|
describe('forkManager', () => {
|
|
@@ -50,7 +52,8 @@ describe('@jupyter/docprovider', () => {
|
|
|
50
52
|
description: 'my fork description',
|
|
51
53
|
synchronize: true
|
|
52
54
|
})
|
|
53
|
-
}
|
|
55
|
+
},
|
|
56
|
+
serverSettingsMock
|
|
54
57
|
);
|
|
55
58
|
});
|
|
56
59
|
it('should be able to get all forks', async () => {
|
|
@@ -59,7 +62,8 @@ describe('@jupyter/docprovider', () => {
|
|
|
59
62
|
'api/collaboration/fork/root-uuid',
|
|
60
63
|
{
|
|
61
64
|
method: 'GET'
|
|
62
|
-
}
|
|
65
|
+
},
|
|
66
|
+
serverSettingsMock
|
|
63
67
|
);
|
|
64
68
|
});
|
|
65
69
|
it('should be able to get delete forks', async () => {
|
|
@@ -68,7 +72,8 @@ describe('@jupyter/docprovider', () => {
|
|
|
68
72
|
'api/collaboration/fork/fork-uuid?merge=true',
|
|
69
73
|
{
|
|
70
74
|
method: 'DELETE'
|
|
71
|
-
}
|
|
75
|
+
},
|
|
76
|
+
serverSettingsMock
|
|
72
77
|
);
|
|
73
78
|
});
|
|
74
79
|
it('should be able to emit fork added signal', async () => {
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
import { historyIcon } from '@jupyterlab/ui-components';
|
|
14
14
|
import { Notification } from '@jupyterlab/apputils';
|
|
15
15
|
import { IForkProvider } from './ydrive';
|
|
16
|
+
import { ServerConnection } from '@jupyterlab/services';
|
|
16
17
|
|
|
17
18
|
type Props = {
|
|
18
19
|
apiURL: string;
|
|
@@ -20,6 +21,7 @@ type Props = {
|
|
|
20
21
|
contentType: string;
|
|
21
22
|
format: string;
|
|
22
23
|
documentTimelineUrl: string;
|
|
24
|
+
serverSettings?: ServerConnection.ISettings;
|
|
23
25
|
};
|
|
24
26
|
|
|
25
27
|
export const TimelineSliderComponent: React.FC<Props> = ({
|
|
@@ -27,7 +29,8 @@ export const TimelineSliderComponent: React.FC<Props> = ({
|
|
|
27
29
|
provider,
|
|
28
30
|
contentType,
|
|
29
31
|
format,
|
|
30
|
-
documentTimelineUrl
|
|
32
|
+
documentTimelineUrl,
|
|
33
|
+
serverSettings
|
|
31
34
|
}) => {
|
|
32
35
|
const [data, setData] = useState({
|
|
33
36
|
roomId: '',
|
|
@@ -51,7 +54,8 @@ export const TimelineSliderComponent: React.FC<Props> = ({
|
|
|
51
54
|
const response = await requestDocumentTimeline(
|
|
52
55
|
format,
|
|
53
56
|
contentType,
|
|
54
|
-
notebookPath
|
|
57
|
+
notebookPath,
|
|
58
|
+
serverSettings
|
|
55
59
|
);
|
|
56
60
|
|
|
57
61
|
if (!response.ok) {
|
|
@@ -79,7 +83,8 @@ export const TimelineSliderComponent: React.FC<Props> = ({
|
|
|
79
83
|
sessionRef.current = await requestDocSession(
|
|
80
84
|
format,
|
|
81
85
|
contentType,
|
|
82
|
-
extractFilenameFromURL(apiURL)
|
|
86
|
+
extractFilenameFromURL(apiURL),
|
|
87
|
+
serverSettings
|
|
83
88
|
);
|
|
84
89
|
}
|
|
85
90
|
setToggle(true);
|
|
@@ -102,7 +107,8 @@ export const TimelineSliderComponent: React.FC<Props> = ({
|
|
|
102
107
|
`${sessionRef.current.format}:${sessionRef.current.type}:${sessionRef.current.fileId}`,
|
|
103
108
|
'restore',
|
|
104
109
|
0,
|
|
105
|
-
data.forkRoom
|
|
110
|
+
data.forkRoom,
|
|
111
|
+
serverSettings
|
|
106
112
|
);
|
|
107
113
|
|
|
108
114
|
if (response.code === 200) {
|
|
@@ -138,7 +144,8 @@ export const TimelineSliderComponent: React.FC<Props> = ({
|
|
|
138
144
|
`${sessionRef.current.format}:${sessionRef.current.type}:${sessionRef.current.fileId}`,
|
|
139
145
|
action,
|
|
140
146
|
steps,
|
|
141
|
-
data.forkRoom
|
|
147
|
+
data.forkRoom,
|
|
148
|
+
serverSettings
|
|
142
149
|
);
|
|
143
150
|
} catch (error: any) {
|
|
144
151
|
console.error('Error fetching or applying updates:', error);
|