Skip to content
This repository has been archived by the owner on Feb 8, 2024. It is now read-only.

Commit

Permalink
defer binder connection (#2132)
Browse files Browse the repository at this point in the history
  • Loading branch information
vabarbosa authored Jun 21, 2023
1 parent 0ed8674 commit d13f143
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 21 deletions.
4 changes: 2 additions & 2 deletions frontend/scss/variables/settings.scss
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ $spacing-unit-small: 12px;
$spacing-unit: 24px;

// Grid parameters.
$column-size-large: 4rem;
$column-size-large: 6rem;
$column-size-medium: 5rem;
$column-size-small: 5rem;
$column-size-small: 4rem;
8 changes: 8 additions & 0 deletions frontend/vue/components/CodeExercise/CodeExercise.vue
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
<ExerciseActionsBar
class="code-exercise__editor-block__actions-bar"
:is-running="isKernelBusy"
:is-loading="isKernelLoading"
:is-api-token-needed="isApiTokenNeeded"
:run-enabled="isKernelReady"
:grade-enabled="isKernelReady && isGradingExercise"
Expand All @@ -35,6 +36,7 @@
@running="kernelRunning"
@finished="kernelFinished"
@kernelReady="kernelReady"
@kernelLoading="kernelLoading"
@correctAnswer="gradeSuccess"
/>
<div
Expand Down Expand Up @@ -111,6 +113,7 @@ export default defineComponent({
initialCode: '',
isKernelBusy: false,
isKernelReady: false,
isKernelLoading: false,
hideInitialOutput: false,
isApiTokenNeeded: this.usesHardware,
id: 0
Expand Down Expand Up @@ -183,12 +186,17 @@ export default defineComponent({
kernelRunning () {
this.isKernelBusy = true
this.hideInitialOutput = true
this.isKernelLoading = false
},
kernelFinished () {
this.isKernelBusy = false
},
kernelReady () {
this.isKernelReady = true
this.isKernelLoading = false
},
kernelLoading () {
this.isKernelLoading = true
}
}
})
Expand Down
40 changes: 24 additions & 16 deletions frontend/vue/components/CodeExercise/CodeOutput.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<template>
<div ref="outputDiv" class="code-output">
<div>
<div v-if="!kernel && !error" class="code-output__state-info">
<div v-if="kernelLoading && !error" class="code-output__state-info">
<bx-loading class="code-output__state-info__icon" assistive-text="Connecting to the server" type="small" />
{{ $translate('Connecting to the server') }}
</div>
Expand Down Expand Up @@ -45,6 +45,7 @@ export default defineComponent({
},
data () {
return {
kernelLoading: false,
kernelPromise: undefined as Promise<IKernelConnection> | undefined,
kernel: undefined as IKernelConnection | undefined,
outputArea: undefined as OutputArea | undefined,
Expand All @@ -53,19 +54,6 @@ export default defineComponent({
}
},
mounted () {
this.$emit('loadingKernel')
const outputDivRef = (this.$refs.outputDiv as HTMLDivElement)
this.kernelPromise = requestBinderKernel()
this.kernelPromise.then((kernel: IKernelConnection) => {
this.kernel = kernel
this.$emit('kernelReady')
this.outputArea = createOutputArea(outputDivRef)
}, (error: Error) => {
this.error = error.message
})
this.apiTokenPromise = getQiskitUser().then(user => user?.apiToken)
},
methods: {
Expand Down Expand Up @@ -103,9 +91,9 @@ export default defineComponent({
},
_executeCode (code: string) {
this.error = ''
this.outputArea!.setHidden(true)
this.kernelPromise!.then((kernel: IKernelConnection) => {
this._initKernel()!.then((kernel: IKernelConnection) => {
this.$emit('running')
this.outputArea!.setHidden(true)
try {
const requestFuture = kernel.requestExecute({ code })
this.setOutputFuture(requestFuture)
Expand All @@ -128,6 +116,26 @@ export default defineComponent({
}
})
},
_initKernel (): Promise<IKernelConnection> {
if (this.kernelPromise) {
return this.kernelPromise
}
this.$emit('kernelLoading')
this.kernelLoading = true
const outputDivRef = (this.$refs.outputDiv as HTMLDivElement)
this.kernelPromise = requestBinderKernel()
return this.kernelPromise.then((kernel: IKernelConnection) => {
this.kernelLoading = false
this.$emit('kernelReady')
this.outputArea = createOutputArea(outputDivRef)
return kernel
}, (error: Error) => {
this.error = error.message
}) as Promise<IKernelConnection>
},
setOutputFuture (future : IOutputShellFuture) {
this.outputArea!.future = future
},
Expand Down
23 changes: 21 additions & 2 deletions frontend/vue/components/CodeExercise/ExerciseActionsBar.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
<template>
<div class="exercise-actions-bar">
<button
v-if="!runEnabled && !isRunning && !isApiTokenNeeded"
class="exercise-actions-bar__button exercise-actions-bar__button_kernel"
@click="run(isApiTokenNeeded)"
:class="{'exercise-actions-bar__button exercise-actions-bar__button_disabled': isLoading}"
:disabled="isLoading"
>
{{ $translate('Start kernel and run') }}
</button>
<button
v-if="runEnabled && !isRunning && !isApiTokenNeeded"
class="exercise-actions-bar__button exercise-actions-bar__button_run"
Expand Down Expand Up @@ -32,6 +41,11 @@ import 'carbon-web-components/es/components/loading/loading'
export default defineComponent({
name: 'ExerciseActionsBar',
props: {
isLoading: {
type: Boolean,
required: false,
default: true
},
isRunning: {
type: Boolean,
required: false,
Expand Down Expand Up @@ -91,7 +105,7 @@ export default defineComponent({
&__button {
padding: $spacing-03;
width: $column-size-large;
width: $column-size-small;
max-width: 100%;
background-size: 200% 100%;
Expand All @@ -113,9 +127,14 @@ export default defineComponent({
cursor: not-allowed;
}
&_run {
&_run,
&_kernel {
@include bicolor-background($button-background-color-quaternary-dark, $button-background-color-quaternary);
}
&_kernel {
width: 2 * $column-size-medium;
}
}
&__indicator {
Expand Down
9 changes: 9 additions & 0 deletions frontend/vue/components/UtilityPanel/Scratchpad.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<ExerciseActionsBar
class="scratchpad__editor-block__actions-bar"
:is-running="isKernelBusy"
:is-loading="isKernelLoading"
:run-enabled="isKernelReady"
:grade-enabled="isKernelReady && isGradingExercise"
:is-api-token-needed="isApiTokenNeeded"
Expand All @@ -41,6 +42,7 @@
@running="kernelRunning"
@finished="kernelFinished"
@kernelReady="kernelReady"
@kernelLoading="kernelLoading"
/>
</div>
</div>
Expand Down Expand Up @@ -75,6 +77,7 @@ type scratchpadCopyRequestEvent = Event & { detail: { code: string } }
})
export default class Scratchpad extends Vue {
code = INITIAL_CODE
isKernelLoading = false
isKernelBusy = false
isKernelReady = false
isGradingExercise = false
Expand Down Expand Up @@ -120,6 +123,7 @@ export default class Scratchpad extends Vue {
kernelRunning () {
this.isKernelBusy = true
this.isKernelLoading = true
}
kernelFinished () {
Expand All @@ -128,6 +132,11 @@ export default class Scratchpad extends Vue {
kernelReady () {
this.isKernelReady = true
this.isKernelLoading = true
}
kernelLoading () {
this.isKernelLoading = true
}
}
</script>
Expand Down
2 changes: 1 addition & 1 deletion frontend/vue/components/common/AppCta.vue
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ export default class AppCta extends Vue.with(Props) {
align-items: center;
padding: $spacing-05;
width: 4 * $column-size-large;
width: 4 * $column-size-small;
max-width: 100%;
@include mq($from: medium, $until: large) {
Expand Down

0 comments on commit d13f143

Please sign in to comment.