Skip to content

Commit 7257f01

Browse files
committed
Experimental local jupyter support
1 parent dc7f4e5 commit 7257f01

File tree

11 files changed

+1323
-18
lines changed

11 files changed

+1323
-18
lines changed

package-lock.json

Lines changed: 45 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
},
2121
"dependencies": {
2222
"@fails-components/config": "^1.5.4",
23-
"@fails-components/data": "^1.3.0",
23+
"@fails-components/data": "^1.4.0",
2424
"@fails-components/webtransport": "^1.1.4",
2525
"@fortawesome/fontawesome-svg-core": "^6.5.1",
2626
"@fortawesome/free-solid-svg-icons": "^6.5.1",
@@ -31,13 +31,15 @@
3131
"chart.js": "^3.5.1",
3232
"color": "^3.1.3",
3333
"dexie": "^3.2.2",
34+
"image-blob-reduce": "^3.0.1",
3435
"file-loader": "^6.2.0",
3536
"jshashes": "^1.0.8",
3637
"jwt-decode": "^3.1.2",
3738
"katex": "^0.16.10",
3839
"libav.js": "^4.8.6",
3940
"libavjs-webcodecs-polyfill": "^0.4.4",
4041
"pdfjs-dist": "^4.2.67",
42+
"pica": "^7.1.0",
4143
"primeflex": "^2.0.0",
4244
"primeicons": "^4.1.0",
4345
"primereact": "^6.6.0",

src/index.css

Lines changed: 162 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,161 @@ code {
7474
}
7575
}
7676

77+
.appletHeading {
78+
display: flex;
79+
align-items: center;
80+
padding: 0px 0px;
81+
/*height: 2.357rem; */
82+
width: 100%;
83+
}
84+
85+
.appletHeadingText {
86+
flex-grow: 1;
87+
text-align: left;
88+
font-weight: 600;
89+
font-size: 1.3rem;
90+
padding-left: 2px;
91+
display: flex;
92+
align-items: center;
93+
color: white;
94+
text-overflow: ellipsis;
95+
white-space: nowrap;
96+
overflow: hidden;
97+
}
98+
99+
.appletButtons {
100+
padding: 0.80rem;
101+
color: whitesmoke;
102+
border-radius: 24px;
103+
outline: none;
104+
border: none;
105+
background-color: #003d5ee5;
106+
}
107+
108+
.appletButtonsSelected {
109+
background-color: #0077b699;
110+
}
111+
112+
.appletButtons:hover {
113+
background-color: #0077b699;
114+
}
115+
116+
.appletKernelStatus{
117+
padding: 0.50rem;
118+
margin-right: 0.1rem;
119+
border-radius: 0.9rem;
120+
outline-style: solid;
121+
outline-width: 0.15rem;
122+
outline-color: #ffffffee;
123+
}
124+
125+
@keyframes kernelstatus-pulsate {
126+
0% {
127+
background-color: var(--first-color);
128+
}
129+
50% {
130+
background-color: var(--second-color);
131+
}
132+
100% {
133+
background-color: var(--first-color);
134+
}
135+
}
136+
137+
.appletKernelStatus.appletKernelStatusidle{
138+
background-color: #00b663;
139+
}
140+
141+
.appletKernelStatus.appletKernelStatusunknown{
142+
background-color: transparent;
143+
}
144+
.appletKernelStatus.appletKernelStatusstarting{
145+
animation: kernelstatus-pulsate 1s infinite;
146+
--first-color: #e95100;
147+
--second-color: #ff7c37;
148+
}
149+
.appletKernelStatus.appletKernelStatusbusy{
150+
background-color: #ff7c37;
151+
}
152+
.appletKernelStatus.appletKernelStatusterminating{
153+
animation: kernelstatus-pulsate 1s infinite;
154+
--first-color: #e95100;
155+
--second-color: #ff7c37;
156+
}
157+
.appletKernelStatus.appletKernelStatusrestarting{
158+
animation: kernelstatus-pulsate 1s infinite;
159+
--first-color: #e95100;
160+
--second-color: #ff7c37;
161+
}
162+
.appletKernelStatus.appletKernelStatusautorestarting{
163+
animation: kernelstatus-pulsate 1s infinite;
164+
--first-color: #e95100;
165+
--second-color: #ff7c37;
166+
}
167+
.appletKernelStatus.appletKernelStatusdead{
168+
background-color: #e95100;
169+
}
170+
171+
.appletMain{
172+
border-radius: 18px;
173+
background-color: #003d5ee5;
174+
cursor: auto;
175+
animation: fadeInAppletMain linear 0.5s;
176+
transition: left 0.5s ease
177+
}
178+
179+
.appletMainMove{
180+
transition: left 0.05s ease, top 0.05s ease, width 0.05s ease, height 0.05s ease;
181+
}
182+
183+
.appletIframe{
184+
background-color: #efefef;
185+
color: black;
186+
border-radius: 10px;
187+
text-overflow: ellipsis;
188+
overflow: hidden;
189+
}
190+
191+
192+
.appletCollapsed{
193+
cursor: auto;
194+
background-color: #003d5ee5;
195+
left: 0.7rem;
196+
width: 2.357rem;
197+
height: 2.357rem;
198+
border-radius: 0rem 2rem 2rem 2rem;
199+
transform: rotate(-45deg);
200+
transition: left 0.5s ease;
201+
}
202+
203+
.appletCollapsed.appletCollapsedHidden{
204+
left: -5rem;
205+
}
206+
207+
.appletCollapsedContent {
208+
transform: rotate(45deg);
209+
position: absolute;
210+
left: 0.8rem;
211+
top: 0.5rem;
212+
color: white;
213+
}
214+
215+
216+
@keyframes fadeInAppletMain {
217+
0% {opacity:0;}
218+
20% {opacity:0;}
219+
100% {opacity:1;}
220+
}
221+
222+
.link-button {
223+
background-color: transparent;
224+
border: none;
225+
cursor: pointer;
226+
text-decoration: underline;
227+
display: inline;
228+
margin: 0;
229+
padding: 0;
230+
}
231+
77232
.magicPath {
78233
fill: #80ffff;
79234
animation: dash 15s linear infinite;
@@ -136,6 +291,12 @@ code {
136291
animation: fadeInWelcome linear 4s;
137292
}
138293

294+
@keyframes fadeInWelcome {
295+
0% {opacity:0;}
296+
20% {opacity:0;}
297+
100% {opacity:1;}
298+
}
299+
139300
.hiddenButton {
140301
display:none !important;
141302
}
@@ -144,11 +305,7 @@ code {
144305
white-space: pre-line;
145306
}
146307

147-
@keyframes fadeInWelcome {
148-
0% {opacity:0;}
149-
20% {opacity:0;}
150-
100% {opacity:1;}
151-
}
308+
152309

153310
.buttonbar {
154311
position: absolute;

src/socket/interface.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ export class SocketInterface {
4141
this.createScreenReq = []
4242
this.createNotepadReq = []
4343
this.getAvailablePictsReq = []
44+
this.getAvailableIpynbsReq = []
45+
this.uploadPictureReq = {}
4446
this.getPollsReq = []
4547
this.castVoteReq = []
4648

@@ -106,6 +108,30 @@ export class SocketInterface {
106108
if (this.getAvailablePictsReq.length === 0)
107109
throw new Error('getAvailablePicts without request')
108110
this.getAvailablePictsReq.shift().resolve(event.data.data)
111+
break
112+
case 'getAvailableIpynbs':
113+
if (this.getAvailableIpynbsReq.length === 0)
114+
throw new Error('getAvailableIpynbs without request')
115+
this.getAvailableIpynbsReq.shift().resolve(event.data.data)
116+
break
117+
case 'uploadPicture':
118+
if (
119+
!this.uploadPictureReq[event.data.data.name] ||
120+
this.uploadPictureReq[event.data.data.name].length === 0
121+
)
122+
throw new Error('uploadPicture without request')
123+
if (event.data.data.error) {
124+
this.uploadPictureReq[event.data.data.name]
125+
.shift()
126+
.reject(new Error(event.data.data.error))
127+
} else {
128+
this.uploadPictureReq[event.data.data.name]
129+
.shift()
130+
.resolve(event.data.data)
131+
}
132+
if (this.uploadPictureReq[event.data.data.name].length === 0)
133+
delete this.uploadPictureReq[event.data.data.name]
134+
109135
break
110136
case 'getPolls':
111137
if (this.getPollsReq.length === 0)
@@ -250,6 +276,34 @@ export class SocketInterface {
250276
return promise
251277
}
252278

279+
getAvailableIpynbs() {
280+
const promise = new Promise((resolve, reject) => {
281+
this.getAvailableIpynbsReq.push({ resolve, reject })
282+
})
283+
SocketInterface.worker.postMessage({
284+
task: 'getAvailableIpynbs'
285+
})
286+
return promise
287+
}
288+
289+
async uploadPicture(name, picture, thumbnail) {
290+
if (!name) throw new Error('No name passed to upload picture')
291+
const promise = new Promise((resolve, reject) => {
292+
if (!this.uploadPictureReq[name]) this.uploadPictureReq[name] = []
293+
this.uploadPictureReq[name].push({ resolve, reject })
294+
})
295+
const pictbuffer = await picture.arrayBuffer()
296+
const thumbbuffer = await thumbnail.arrayBuffer()
297+
SocketInterface.worker.postMessage({
298+
task: 'uploadPicture',
299+
name,
300+
picture: pictbuffer,
301+
thumbnail: thumbbuffer,
302+
type: picture.type
303+
})
304+
return promise
305+
}
306+
253307
getPolls() {
254308
const promise = new Promise((resolve, reject) => {
255309
this.getPollsReq.push({ resolve, reject })

0 commit comments

Comments
 (0)