chore: merge central/staging into self-hosted/main

This commit is contained in:
Andrew Bastin
2023-04-11 14:37:45 +05:30
6 changed files with 232 additions and 18 deletions

View File

@@ -299,7 +299,8 @@ const removeCollection = () => {
) {
emit("select", null)
}
removeGraphqlCollection(props.collectionIndex)
removeGraphqlCollection(props.collectionIndex, props.collection.id)
toast.success(`${t("state.deleted")}`)
}

View File

@@ -279,7 +279,7 @@ const removeFolder = () => {
emit("select", { picked: null })
}
removeGraphqlFolder(props.folderPath)
removeGraphqlFolder(props.folderPath, props.folder.id)
toast.success(t("state.deleted"))
}

View File

@@ -214,7 +214,7 @@ const removeRequest = () => {
emit("select", null)
}
removeGraphqlRequest(props.folderPath, props.requestIndex)
removeGraphqlRequest(props.folderPath, props.requestIndex, props.request.id)
toast.success(`${t("state.deleted")}`)
}
</script>

View File

@@ -183,6 +183,8 @@ import {
updateRESTRequestOrder,
updateRESTCollectionOrder,
moveRESTFolder,
navigateToFolderWithIndexPath,
restCollectionStore,
} from "~/newstore/collections"
import TeamCollectionAdapter from "~/helpers/teams/TeamCollectionAdapter"
import {
@@ -1014,6 +1016,13 @@ const onRemoveCollection = () => {
if (collectionsType.value.type === "my-collections") {
const collectionIndex = editingCollectionIndex.value
const collectionToRemove =
collectionIndex || collectionIndex == 0
? navigateToFolderWithIndexPath(restCollectionStore.value.state, [
collectionIndex,
])
: undefined
if (collectionIndex === null) return
if (
@@ -1024,7 +1033,10 @@ const onRemoveCollection = () => {
emit("select", null)
}
removeRESTCollection(collectionIndex)
removeRESTCollection(
collectionIndex,
collectionToRemove ? collectionToRemove.id : undefined
)
resolveSaveContextOnCollectionReorder({
lastIndex: collectionIndex,
@@ -1077,7 +1089,14 @@ const onRemoveFolder = () => {
emit("select", null)
}
removeRESTFolder(folderPath)
const folderToRemove = folderPath
? navigateToFolderWithIndexPath(
restCollectionStore.value.state,
folderPath.split("/").map((i) => parseInt(i))
)
: undefined
removeRESTFolder(folderPath, folderToRemove ? folderToRemove.id : undefined)
const parentFolder = folderPath.split("/").slice(0, -1).join("/") // remove last folder to get parent folder
resolveSaveContextOnCollectionReorder({
@@ -1151,7 +1170,12 @@ const onRemoveRequest = () => {
possibleTab.value.document.isDirty = true
}
removeRESTRequest(folderPath, requestIndex)
const requestToRemove = navigateToFolderWithIndexPath(
restCollectionStore.value.state,
folderPath.split("/").map((i) => parseInt(i))
)?.requests[requestIndex]
removeRESTRequest(folderPath, requestIndex, requestToRemove?.id)
// the same function is used to reorder requests since after removing, it's basically doing reorder
resolveSaveContextOnRequestReorder({

View File

@@ -33,6 +33,10 @@ const defaultGraphqlCollectionState = {
type RESTCollectionStoreType = typeof defaultRESTCollectionState
type GraphqlCollectionStoreType = typeof defaultGraphqlCollectionState
/**
* NOTE: this function is not pure. It mutates the indexPaths inplace
* Not removing this behaviour because i'm not sure if we utilize this behaviour anywhere and i found this on a tight time crunch.
*/
export function navigateToFolderWithIndexPath(
collections: HoppCollection<HoppRESTRequest | HoppGQLRequest>[],
indexPaths: number[]
@@ -86,7 +90,12 @@ const restCollectionDispatchers = defineDispatchers({
removeCollection(
{ state }: RESTCollectionStoreType,
{ collectionIndex }: { collectionIndex: number }
{
collectionIndex,
// this collectionID is used to sync the collection removal
// eslint-disable-next-line @typescript-eslint/no-unused-vars
collectionID,
}: { collectionIndex: number; collectionID?: string }
) {
return {
state: (state as any).filter(
@@ -174,7 +183,12 @@ const restCollectionDispatchers = defineDispatchers({
}
},
removeFolder({ state }: RESTCollectionStoreType, { path }: { path: string }) {
removeFolder(
{ state }: RESTCollectionStoreType,
// folderID is used to sync the folder removal in collections.sync.ts
// eslint-disable-next-line @typescript-eslint/no-unused-vars
{ path, folderID }: { path: string; folderID?: string }
) {
const newState = state
const indexPaths = path.split("/").map((x) => parseInt(x))
@@ -415,7 +429,13 @@ const restCollectionDispatchers = defineDispatchers({
removeRequest(
{ state }: RESTCollectionStoreType,
{ path, requestIndex }: { path: string; requestIndex: number }
{
path,
requestIndex,
// this requestID is used to sync the request removal
// eslint-disable-next-line @typescript-eslint/no-unused-vars
requestID,
}: { path: string; requestIndex: number; requestID?: string }
) {
const newState = state
@@ -573,6 +593,31 @@ const restCollectionDispatchers = defineDispatchers({
state: newState,
}
},
// only used for collections.sync.ts to prevent double insertion of collections from storeSync and Subscriptions
removeDuplicateCollectionOrFolder(
{ state },
{
id,
collectionPath,
type,
}: {
id: string
collectionPath: string
type: "collection" | "request"
}
) {
const after = removeDuplicateCollectionsFromPath<HoppRESTRequest>(
id,
collectionPath,
state,
type ?? "collection"
)
return {
state: after,
}
},
})
const gqlCollectionDispatchers = defineDispatchers({
@@ -605,7 +650,11 @@ const gqlCollectionDispatchers = defineDispatchers({
removeCollection(
{ state }: GraphqlCollectionStoreType,
{ collectionIndex }: { collectionIndex: number }
{
collectionIndex, // this collectionID is used to sync the collection removal
// eslint-disable-next-line @typescript-eslint/no-unused-vars
collectionID,
}: { collectionIndex: number; collectionID?: string }
) {
return {
state: (state as any).filter(
@@ -687,7 +736,9 @@ const gqlCollectionDispatchers = defineDispatchers({
removeFolder(
{ state }: GraphqlCollectionStoreType,
{ path }: { path: string }
// folderID is used to sync the folder removal in collections.sync.ts
// eslint-disable-next-line @typescript-eslint/no-unused-vars
{ path, folderID }: { path: string; folderID?: string }
) {
const newState = state
@@ -775,7 +826,13 @@ const gqlCollectionDispatchers = defineDispatchers({
removeRequest(
{ state }: GraphqlCollectionStoreType,
{ path, requestIndex }: { path: string; requestIndex: number }
{
path,
requestIndex,
// this requestID is used to sync the request removal
// eslint-disable-next-line @typescript-eslint/no-unused-vars
requestID,
}: { path: string; requestIndex: number; requestID?: string }
) {
const newState = state
@@ -838,6 +895,30 @@ const gqlCollectionDispatchers = defineDispatchers({
state: newState,
}
},
// only used for collections.sync.ts to prevent double insertion of collections from storeSync and Subscriptions
removeDuplicateCollectionOrFolder(
{ state },
{
id,
collectionPath,
type,
}: {
id: string
collectionPath: string
type: "collection" | "request"
}
) {
const after = removeDuplicateCollectionsFromPath<HoppGQLRequest>(
id,
collectionPath,
state,
type ?? "collection"
)
return {
state: after,
}
},
})
export const restCollectionStore = new DispatchingStore(
@@ -887,11 +968,15 @@ export function addRESTCollection(collection: HoppCollection<HoppRESTRequest>) {
})
}
export function removeRESTCollection(collectionIndex: number) {
export function removeRESTCollection(
collectionIndex: number,
collectionID?: string
) {
restCollectionStore.dispatch({
dispatcher: "removeCollection",
payload: {
collectionIndex,
collectionID,
},
})
}
@@ -936,11 +1021,12 @@ export function editRESTFolder(
})
}
export function removeRESTFolder(path: string) {
export function removeRESTFolder(path: string, folderID?: string) {
restCollectionStore.dispatch({
dispatcher: "removeFolder",
payload: {
path,
folderID,
},
})
}
@@ -955,6 +1041,21 @@ export function moveRESTFolder(path: string, destinationPath: string | null) {
})
}
export function removeDuplicateRESTCollectionOrFolder(
id: string,
collectionPath: string,
type?: "collection" | "request"
) {
restCollectionStore.dispatch({
dispatcher: "removeDuplicateCollectionOrFolder",
payload: {
id,
collectionPath,
type: type ?? "collection",
},
})
}
export function editRESTRequest(
path: string,
requestIndex: number,
@@ -996,12 +1097,17 @@ export function saveRESTRequestAs(path: string, request: HoppRESTRequest) {
return insertionIndex
}
export function removeRESTRequest(path: string, requestIndex: number) {
export function removeRESTRequest(
path: string,
requestIndex: number,
requestID?: string
) {
restCollectionStore.dispatch({
dispatcher: "removeRequest",
payload: {
path,
requestIndex,
requestID,
},
})
}
@@ -1082,11 +1188,15 @@ export function addGraphqlCollection(
})
}
export function removeGraphqlCollection(collectionIndex: number) {
export function removeGraphqlCollection(
collectionIndex: number,
collectionID?: string
) {
graphqlCollectionStore.dispatch({
dispatcher: "removeCollection",
payload: {
collectionIndex,
collectionID,
},
})
}
@@ -1127,11 +1237,27 @@ export function editGraphqlFolder(
})
}
export function removeGraphqlFolder(path: string) {
export function removeGraphqlFolder(path: string, folderID?: string) {
graphqlCollectionStore.dispatch({
dispatcher: "removeFolder",
payload: {
path,
folderID,
},
})
}
export function removeDuplicateGraphqlCollectionOrFolder(
id: string,
collectionPath: string,
type?: "collection" | "request"
) {
graphqlCollectionStore.dispatch({
dispatcher: "removeDuplicateCollectionOrFolder",
payload: {
id,
collectionPath,
type: type ?? "collection",
},
})
}
@@ -1161,12 +1287,17 @@ export function saveGraphqlRequestAs(path: string, request: HoppGQLRequest) {
})
}
export function removeGraphqlRequest(path: string, requestIndex: number) {
export function removeGraphqlRequest(
path: string,
requestIndex: number,
requestID?: string
) {
graphqlCollectionStore.dispatch({
dispatcher: "removeRequest",
payload: {
path,
requestIndex,
requestID,
},
})
}
@@ -1185,3 +1316,60 @@ export function moveGraphqlRequest(
},
})
}
function removeDuplicateCollectionsFromPath<
T extends HoppRESTRequest | HoppGQLRequest
>(
idToRemove: string,
collectionPath: string | null,
collections: HoppCollection<T>[],
type: "collection" | "request"
): HoppCollection<T>[] {
const indexes = collectionPath?.split("/").map((x) => parseInt(x))
indexes && indexes.pop()
const parentPath = indexes?.join("/")
const parentCollection = parentPath
? navigateToFolderWithIndexPath(
collections,
parentPath.split("/").map((x) => parseInt(x)) || []
)
: undefined
if (collectionPath && parentCollection) {
if (type == "collection") {
parentCollection.folders = removeDuplicatesFromAnArrayById(
idToRemove,
parentCollection.folders
)
} else {
parentCollection.requests = removeDuplicatesFromAnArrayById(
idToRemove,
parentCollection.requests
)
}
} else {
return removeDuplicatesFromAnArrayById(idToRemove, collections)
}
return collections
function removeDuplicatesFromAnArrayById<T extends { id?: string }>(
idToRemove: string,
arrayWithID: T[]
) {
const duplicateEntries = arrayWithID.filter(
(entry) => entry.id === idToRemove
)
if (duplicateEntries.length == 2) {
const duplicateEntryIndex = arrayWithID.findIndex(
(entry) => entry.id === idToRemove
)
arrayWithID.splice(duplicateEntryIndex, 1)
}
return arrayWithID
}
}

View File

@@ -11,6 +11,7 @@ export type GQLHeader = {
}
export type HoppGQLRequest = {
id?: string
v: number
name: string
url: string