From 98fa140b553c468c5cede1594290e9ede3c38971 Mon Sep 17 00:00:00 2001 From: Vignesh p Date: Mon, 28 Jul 2025 14:58:04 +0530 Subject: [PATCH] feat: preserve response viewer scroll position per tab (#5193) Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> Co-authored-by: nivedin --- .../src/components/http/RequestTab.vue | 6 +- .../src/components/http/Response.vue | 7 +- .../lenses/ResponseBodyRenderer.vue | 2 + .../lenses/renderers/HTMLLensRenderer.vue | 15 ++- .../lenses/renderers/JSONLensRenderer.vue | 14 ++- .../lenses/renderers/RawLensRenderer.vue | 14 ++- .../lenses/renderers/XMLLensRenderer.vue | 14 ++- .../src/composables/useScrollerRef.ts | 113 ++++++++++++++++++ .../hoppscotch-common/src/pages/index.vue | 10 +- .../services/__tests__/scroll.service.spec.ts | 99 +++++++++++++++ .../src/services/scroll.service.ts | 98 +++++++++++++++ 11 files changed, 381 insertions(+), 11 deletions(-) create mode 100644 packages/hoppscotch-common/src/composables/useScrollerRef.ts create mode 100644 packages/hoppscotch-common/src/services/__tests__/scroll.service.spec.ts create mode 100644 packages/hoppscotch-common/src/services/scroll.service.ts diff --git a/packages/hoppscotch-common/src/components/http/RequestTab.vue b/packages/hoppscotch-common/src/components/http/RequestTab.vue index 3fc63907..6e9a65a0 100644 --- a/packages/hoppscotch-common/src/components/http/RequestTab.vue +++ b/packages/hoppscotch-common/src/components/http/RequestTab.vue @@ -9,7 +9,11 @@ /> diff --git a/packages/hoppscotch-common/src/components/http/Response.vue b/packages/hoppscotch-common/src/components/http/Response.vue index 95289a1b..58f5b243 100644 --- a/packages/hoppscotch-common/src/components/http/Response.vue +++ b/packages/hoppscotch-common/src/components/http/Response.vue @@ -5,6 +5,7 @@ v-if="!loading && hasResponse" v-model:document="doc" :is-editable="false" + :tab-id="tabId" @save-as-example="saveAsExample" /> @@ -40,6 +41,7 @@ const toast = useToast() const props = defineProps<{ document: HoppRequestDocument + tabId: string isEmbed: boolean }>() @@ -68,7 +70,6 @@ const loading = computed(() => doc.value.response?.type === "loading") const saveAsExample = () => { showSaveResponseName.value = true - responseName.value = doc.value.request.name } @@ -125,14 +126,13 @@ const onSaveAsExample = () => { showSaveResponseName.value = false const saveCtx = doc.value.saveContext - if (!saveCtx) return const req = doc.value.request + if (saveCtx.originLocation === "user-collection") { try { editRESTRequest(saveCtx.folderPath, saveCtx.requestIndex, req) - toast.success(`${t("response.saved")}`) responseName.value = "" } catch (e) { @@ -152,7 +152,6 @@ const onSaveAsExample = () => { responseName.value = "" } else { doc.value.isDirty = false - toast.success(`${t("request.saved")}`) responseName.value = "" } diff --git a/packages/hoppscotch-common/src/components/lenses/ResponseBodyRenderer.vue b/packages/hoppscotch-common/src/components/lenses/ResponseBodyRenderer.vue index 4395530d..c284ae0c 100644 --- a/packages/hoppscotch-common/src/components/lenses/ResponseBodyRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/ResponseBodyRenderer.vue @@ -16,6 +16,7 @@ v-model:response="doc.response" :is-savable="isSavable" :is-editable="isEditable" + :tab-id="props.tabId" @save-as-example="$emit('save-as-example')" /> @@ -76,6 +77,7 @@ import { ConsoleEntry } from "../console/Panel.vue" const props = defineProps<{ document: HoppRequestDocument isEditable: boolean + tabId: string isTestRunner?: boolean }>() diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue index f4e48ead..86e2aea7 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue @@ -61,7 +61,11 @@ /> -
+