Skip to content

Commit 54f34d7

Browse files
committed
Refactor unhandled block error handling in UI
1 parent 0f50478 commit 54f34d7

File tree

4 files changed

+35
-20
lines changed

4 files changed

+35
-20
lines changed

webapp/src/components/datablocks/NotImplementedBlock.vue renamed to webapp/src/components/datablocks/ErrorBlock.vue

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
<DataBlockBase :item_id="item_id" :block_id="block_id">
33
<div class="alert alert-danger d-flex align-items-center ml-3">
44
<font-awesome-icon icon="exclamation-triangle" class="mr-2" />
5-
This block type ({{ blockType }}) is not implemented/installed for
6-
this&nbsp;<i>datalab</i>&nbsp;instance. Please contact
7-
your&nbsp;<i>datalab</i>&nbsp;administrator.
5+
<span v-html="error" />
86
</div>
97
</DataBlockBase>
108
</template>
@@ -30,6 +28,20 @@ export default {
3028
block() {
3129
return this.$store.state.all_item_data[this.item_id]["blocks_obj"][this.block_id];
3230
},
31+
not_implemented_error() {
32+
return (
33+
"The requested block type '" +
34+
this.blockType +
35+
"' is not implemented/installed for this <i>datalab</i> instance. Please contact your <i>datalab</i> administrator."
36+
);
37+
},
38+
error() {
39+
let error_message = this.$store.state.block_errors[this.block_id];
40+
if (!error_message) {
41+
error_message = this.not_implemented_error;
42+
}
43+
return error_message;
44+
},
3345
blockType() {
3446
return this.block?.blocktype;
3547
},

webapp/src/server_fetch_utils.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,6 @@ function fetch_delete(url, body) {
8282

8383
function handleResponse(response) {
8484
return response.text().then((text) => {
85-
console.log("fetch was successful");
86-
console.log(response);
87-
console.log(text);
8885
const data = text && JSON.parse(text);
8986

9087
if (!response.ok) {
@@ -531,12 +528,15 @@ export async function updateBlockFromServer(
531528
block_id: block_id,
532529
isSaved: response_json.saved_successfully,
533530
});
534-
store.commit("setBlockImplementationError", { block_id, hasError: false });
531+
store.commit("setBlockError", { block_id, hasError: false, error: "" });
535532
})
536533
.catch((error) => {
537534
console.warn(`Failed to update block ${block_id}:`, error);
538-
store.commit("setBlockImplementationError", { block_id, hasError: true });
539535
store.commit("setBlockNotUpdating", block_id);
536+
if (!error.includes("Invalid block type")) {
537+
// Do not set any error message for NotImplemented as this will be handled elsewhere
538+
store.commit("setBlockError", { block_id, error: error });
539+
}
540540
});
541541
}
542542

webapp/src/store/index.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export default createStore({
5454
rows: 20,
5555
},
5656
},
57-
block_implementation_errors: {},
57+
block_errors: {},
5858
},
5959
mutations: {
6060
setServerInfo(state, serverInfo) {
@@ -362,11 +362,12 @@ export default createStore({
362362
].filter((item) => !refcodes.includes(item.refcode));
363363
}
364364
},
365-
setBlockImplementationError(state, { block_id, hasError }) {
366-
if (hasError) {
367-
state.block_implementation_errors[block_id] = true;
365+
setBlockError(state, { block_id, error = null }) {
366+
if (error) {
367+
console.warn("Storing block error", block_id, error);
368+
state.block_errors[block_id] = "Block creation API returned error: " + error;
368369
} else {
369-
delete state.block_implementation_errors[block_id];
370+
delete state.block_errors[block_id];
370371
}
371372
},
372373
},

webapp/src/views/EditPage.vue

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ import tinymce from "tinymce/tinymce";
118118
119119
import { itemTypes, API_URL, customBlockTypes } from "@/resources.js";
120120
import BokehBlock from "@/components/datablocks/BokehBlock.vue";
121-
import NotImplementedBlock from "@/components/datablocks/NotImplementedBlock.vue";
121+
import ErrorBlock from "@/components/datablocks/ErrorBlock.vue";
122122
import { formatDistanceToNow } from "date-fns";
123123
124124
import StyledBlockHelp from "@/components/StyledBlockHelp";
@@ -266,13 +266,15 @@ export default {
266266
});
267267
},
268268
getBlockDisplayType(block_id) {
269-
if (this.$store.state.block_implementation_errors[block_id]) {
270-
return NotImplementedBlock;
271-
}
272-
273269
const block = this.blocks[block_id];
274-
if (!block || !block.blocktype) {
275-
return NotImplementedBlock;
270+
if (!block) {
271+
return ErrorBlock;
272+
}
273+
if (!(block.blocktype in this.$store.state.blocksInfos)) {
274+
console.log(
275+
`Block with type ${block.blocktype} does not have a valid blocktype or is not in blocksInfos.`,
276+
);
277+
return ErrorBlock;
276278
}
277279
278280
const type = block.blocktype;

0 commit comments

Comments
 (0)