refactor: better tab dirty check

Mark the tab (saved request under a collection) as not dirty if the request contents are reset to the value since previous save.
This commit is contained in:
jamesgeorge007
2024-05-01 18:37:32 +05:30
parent 9e8112a4e5
commit 0abdc63f0e
4 changed files with 37 additions and 34 deletions

View File

@@ -267,16 +267,11 @@ const saveRequestAs = async () => {
return return
} }
const { providerID, requestID, workspaceID } = requestHandle.value.data
RESTTabs.currentActiveTab.value.document = { RESTTabs.currentActiveTab.value.document = {
request: updatedRequest, request: updatedRequest,
isDirty: false, isDirty: false,
saveContext: { saveContext: {
originLocation: "workspace-user-collection", originLocation: "workspace-user-collection",
workspaceID,
providerID,
requestID,
requestHandle, requestHandle,
}, },
} }
@@ -313,16 +308,12 @@ const saveRequestAs = async () => {
return return
} }
const { providerID, requestID, workspaceID } = requestHandle.value.data
RESTTabs.currentActiveTab.value.document = { RESTTabs.currentActiveTab.value.document = {
request: updatedRequest, request: updatedRequest,
isDirty: false, isDirty: false,
saveContext: { saveContext: {
originLocation: "workspace-user-collection", originLocation: "workspace-user-collection",
workspaceID, requestHandle,
providerID,
requestID,
}, },
} }

View File

@@ -525,24 +525,7 @@ const saveRequest = async () => {
return return
} }
const { requestID } = saveContext const requestHandle = ref(saveContext.requestHandle)
const requestHandleResult = await newWorkspaceService.getRequestHandle(
newWorkspaceService.activeWorkspaceHandle.value,
requestID
)
if (E.isLeft(requestHandleResult)) {
// INVALID_COLLECTION_HANDLE | INVALID_REQUEST_ID | REQUEST_NOT_FOUND
showSaveRequestModal.value = true
if (!tab.value.document.isDirty) {
tab.value.document.isDirty = true
}
return
}
const requestHandle = requestHandleResult.right
if (!requestHandle.value) { if (!requestHandle.value) {
return return

View File

@@ -17,10 +17,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { watch } from "vue" import { watch } from "vue"
import { useVModel } from "@vueuse/core" import { useVModel } from "@vueuse/core"
import { cloneDeep } from "lodash-es" import { cloneDeep, isEqual } from "lodash-es"
import { isEqualHoppRESTRequest } from "@hoppscotch/data"
import { HoppTab } from "~/services/tab" import { HoppTab } from "~/services/tab"
import { HoppRESTDocument } from "~/helpers/rest/document" import { HoppRESTDocument } from "~/helpers/rest/document"
import { WorkspaceRequest } from "~/services/new-workspace/workspace"
import { HandleRef } from "~/services/new-workspace/handle"
// TODO: Move Response and Request execution code to over here // TODO: Move Response and Request execution code to over here
@@ -32,15 +33,43 @@ const emit = defineEmits<{
const tab = useVModel(props, "modelValue", emit) const tab = useVModel(props, "modelValue", emit)
// TODO: Come up with a better dirty check
let oldRequest = cloneDeep(tab.value.document.request) let oldRequest = cloneDeep(tab.value.document.request)
watch( watch(
() => tab.value.document.request, () => tab.value.document.request,
(updatedValue) => { (updatedValue) => {
// Request from the collection tree
if ( if (
!tab.value.document.isDirty && tab.value.document.saveContext?.originLocation ===
!isEqualHoppRESTRequest(oldRequest, updatedValue) "workspace-user-collection"
) { ) {
const requestHandle = tab.value.document.saveContext.requestHandle as
| HandleRef<WorkspaceRequest>["value"]
| undefined
if (!requestHandle || requestHandle.type === "invalid") {
return
}
if (
!tab.value.document.isDirty &&
!isEqual(oldRequest, requestHandle?.data.request)
) {
tab.value.document.isDirty = true
}
if (
tab.value.document.isDirty &&
isEqual(oldRequest, requestHandle?.data.request)
) {
tab.value.document.isDirty = false
}
return
}
// Unsaved request
if (!tab.value.document.isDirty && !isEqual(oldRequest, updatedValue)) {
tab.value.document.isDirty = true tab.value.document.isDirty = true
} }

View File

@@ -88,7 +88,7 @@ export class RESTTabService extends TabService<HoppRESTDocument> {
for (const tab of this.tabMap.values()) { for (const tab of this.tabMap.values()) {
if (tab.document.isDirty) { if (tab.document.isDirty) {
count++ count++
return continue
} }
if ( if (