fix: affected request indices computation post request reorder
This commit is contained in:
@@ -525,13 +525,15 @@ const saveRequest = async () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const requestHandle = ref(saveContext.requestHandle)
|
const { requestHandle } = saveContext
|
||||||
|
|
||||||
if (!requestHandle.value) {
|
const requestHandleRef = requestHandle.get()
|
||||||
|
|
||||||
|
if (!requestHandleRef.value) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requestHandle.value.type === "invalid") {
|
if (requestHandleRef.value.type === "invalid") {
|
||||||
showSaveRequestModal.value = true
|
showSaveRequestModal.value = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -691,17 +691,11 @@ const restCollectionDispatchers = defineDispatchers({
|
|||||||
|
|
||||||
// if the destination is null, we are moving to the end of the list
|
// if the destination is null, we are moving to the end of the list
|
||||||
if (destinationRequestIndex === null) {
|
if (destinationRequestIndex === null) {
|
||||||
// move to the end of the list
|
// TODO: Verify if this can be safely removed
|
||||||
targetLocation.requests.push(
|
targetLocation.requests.push(
|
||||||
targetLocation.requests.splice(requestIndex, 1)[0]
|
targetLocation.requests.splice(requestIndex, 1)[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
resolveSaveContextOnRequestReorder({
|
|
||||||
lastIndex: requestIndex,
|
|
||||||
newIndex: targetLocation.requests.length,
|
|
||||||
folderPath: destinationCollectionPath,
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
state: newState,
|
state: newState,
|
||||||
}
|
}
|
||||||
@@ -709,12 +703,6 @@ const restCollectionDispatchers = defineDispatchers({
|
|||||||
|
|
||||||
reorderItems(targetLocation.requests, requestIndex, destinationRequestIndex)
|
reorderItems(targetLocation.requests, requestIndex, destinationRequestIndex)
|
||||||
|
|
||||||
resolveSaveContextOnRequestReorder({
|
|
||||||
lastIndex: requestIndex,
|
|
||||||
newIndex: destinationRequestIndex,
|
|
||||||
folderPath: destinationCollectionPath,
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
state: newState,
|
state: newState,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ import {
|
|||||||
isValidWorkspaceHandle,
|
isValidWorkspaceHandle,
|
||||||
} from "../helpers"
|
} from "../helpers"
|
||||||
import { lazy } from "~/helpers/utils/lazy"
|
import { lazy } from "~/helpers/utils/lazy"
|
||||||
|
import { getAffectedIndexes } from "~/helpers/collection/affectedIndex"
|
||||||
|
import { request } from "http"
|
||||||
|
|
||||||
export class PersonalWorkspaceProviderService
|
export class PersonalWorkspaceProviderService
|
||||||
extends Service
|
extends Service
|
||||||
@@ -683,10 +685,67 @@ export class PersonalWorkspaceProviderService
|
|||||||
return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const))
|
return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const))
|
||||||
}
|
}
|
||||||
|
|
||||||
const draggedRequestIndex = requestHandleRef.value.data.requestID
|
const { collectionID, requestID: draggedRequestID } =
|
||||||
|
requestHandleRef.value.data
|
||||||
|
|
||||||
|
const collectionRequestCount = getRequestsByPath(
|
||||||
|
restCollectionStore.value.state,
|
||||||
|
collectionID
|
||||||
|
).length
|
||||||
|
|
||||||
|
// Compute the affected request IDs
|
||||||
|
// Maps the previous request ID to the new one affected by the reorder
|
||||||
|
const affectedRequestIndices = getAffectedIndexes(
|
||||||
|
this.pathToLastIndex(draggedRequestID),
|
||||||
|
destinationRequestID === null
|
||||||
|
? collectionRequestCount - 1
|
||||||
|
: this.pathToLastIndex(destinationRequestID)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Compile the handle indices within `issuedHandles` along with the ID to update it based on the affected request indices
|
||||||
|
// This is done in 2 steps since finding the corresponding handle and updating it straightaway would result in ambiguities
|
||||||
|
// Updating the request ID for a certain handle and attempting to find the handle corresponding to the same ID would pick the former handle
|
||||||
|
const affectedRequestHandleUpdateInfo = Array.from(
|
||||||
|
affectedRequestIndices.entries()
|
||||||
|
).map(([oldRequestIndexPos, newRequestIndexPos]) => {
|
||||||
|
const affectedRequestHandleIdx = this.issuedHandles.findIndex(
|
||||||
|
(handle) => {
|
||||||
|
if (handle.value.type === "invalid") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!("requestID" in handle.value.data)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
handle.value.data.requestID ===
|
||||||
|
`${collectionID}/${oldRequestIndexPos}`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return { affectedRequestHandleIdx, newRequestIndexPos }
|
||||||
|
})
|
||||||
|
|
||||||
|
affectedRequestHandleUpdateInfo.forEach(
|
||||||
|
({ affectedRequestHandleIdx, newRequestIndexPos }) => {
|
||||||
|
const handle = this.issuedHandles[affectedRequestHandleIdx]
|
||||||
|
|
||||||
|
if (
|
||||||
|
!handle ||
|
||||||
|
handle.value.type === "invalid" ||
|
||||||
|
!("requestID" in handle.value.data)
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
handle.value.data.requestID = `${collectionID}/${newRequestIndexPos}`
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
updateRESTRequestOrder(
|
updateRESTRequestOrder(
|
||||||
this.pathToLastIndex(draggedRequestIndex),
|
this.pathToLastIndex(draggedRequestID),
|
||||||
destinationRequestID ? this.pathToLastIndex(destinationRequestID) : null,
|
destinationRequestID ? this.pathToLastIndex(destinationRequestID) : null,
|
||||||
destinationCollectionID
|
destinationCollectionID
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user