refactor: integrate REST search collection adapter
This commit is contained in:
@@ -61,7 +61,113 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-1 flex-col">
|
<div class="flex flex-1 flex-col">
|
||||||
<HoppSmartTree :adapter="treeAdapter">
|
<HoppSmartTree v-if="searchText" :adapter="searchTreeAdapter">
|
||||||
|
<template
|
||||||
|
#content="{ highlightChildren, isOpen, node, toggleChildren }"
|
||||||
|
>
|
||||||
|
<NewCollectionsRestCollection
|
||||||
|
v-if="node.data.type === 'collection'"
|
||||||
|
:collection-view="node.data.value"
|
||||||
|
:is-open="isOpen"
|
||||||
|
:is-selected="
|
||||||
|
isSelected(
|
||||||
|
getCollectionIndexPathArgs(node.data.value.collectionID)
|
||||||
|
)
|
||||||
|
"
|
||||||
|
:save-request="saveRequest"
|
||||||
|
@add-request="addRequest"
|
||||||
|
@add-child-collection="addChildCollection"
|
||||||
|
@dragging="
|
||||||
|
(isDraging) =>
|
||||||
|
highlightChildren(
|
||||||
|
isDraging ? node.data.value.collectionID : null
|
||||||
|
)
|
||||||
|
"
|
||||||
|
@drag-event="dragEvent($event, node.data.value.collectionID)"
|
||||||
|
@drop-event="dropEvent($event, node.data.value.collectionID)"
|
||||||
|
@edit-child-collection="editChildCollection"
|
||||||
|
@edit-root-collection="editRootCollection"
|
||||||
|
@edit-collection-properties="editCollectionProperties"
|
||||||
|
@export-collection="exportCollection"
|
||||||
|
@remove-child-collection="removeChildCollection"
|
||||||
|
@remove-root-collection="removeRootCollection"
|
||||||
|
@select-pick="onSelectPick"
|
||||||
|
@toggle-children="
|
||||||
|
() => {
|
||||||
|
toggleChildren(),
|
||||||
|
saveRequest &&
|
||||||
|
onSelectPick({
|
||||||
|
pickedType: isAlreadyInRoot(
|
||||||
|
node.data.value.collectionID
|
||||||
|
)
|
||||||
|
? 'my-collection'
|
||||||
|
: 'my-folder',
|
||||||
|
...getCollectionIndexPathArgs(
|
||||||
|
node.data.value.collectionID
|
||||||
|
),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
"
|
||||||
|
@update-collection-order="
|
||||||
|
updateCollectionOrder($event, {
|
||||||
|
destinationCollectionIndex: node.data.value.collectionID,
|
||||||
|
destinationCollectionParentIndex:
|
||||||
|
node.data.value.parentCollectionID,
|
||||||
|
})
|
||||||
|
"
|
||||||
|
@update-last-collection-order="
|
||||||
|
updateCollectionOrder($event, {
|
||||||
|
destinationCollectionIndex: null,
|
||||||
|
destinationCollectionParentIndex:
|
||||||
|
node.data.value.parentCollectionID,
|
||||||
|
})
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<NewCollectionsRestRequest
|
||||||
|
v-else-if="node.data.type === 'request'"
|
||||||
|
:is-active="isActiveRequest(node.data.value)"
|
||||||
|
:is-selected="
|
||||||
|
isSelected(getRequestIndexPathArgs(node.data.value.requestID))
|
||||||
|
"
|
||||||
|
:request-view="node.data.value"
|
||||||
|
:save-request="saveRequest"
|
||||||
|
@drag-request="
|
||||||
|
dragRequest($event, {
|
||||||
|
parentCollectionIndexPath: node.data.value.parentCollectionID,
|
||||||
|
requestIndex: node.data.value.requestID,
|
||||||
|
})
|
||||||
|
"
|
||||||
|
@duplicate-request="duplicateRequest"
|
||||||
|
@edit-request="editRequest"
|
||||||
|
@remove-request="removeRequest"
|
||||||
|
@select-pick="onSelectPick"
|
||||||
|
@select-request="selectRequest"
|
||||||
|
@share-request="shareRequest"
|
||||||
|
@update-request-order="
|
||||||
|
updateRequestOrder($event, {
|
||||||
|
parentCollectionIndexPath: node.data.value.parentCollectionID,
|
||||||
|
requestIndex: node.data.value.requestID,
|
||||||
|
})
|
||||||
|
"
|
||||||
|
@update-last-request-order="
|
||||||
|
updateRequestOrder($event, {
|
||||||
|
parentCollectionIndexPath: node.data.value.parentCollectionID,
|
||||||
|
requestIndex: null,
|
||||||
|
})
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
<div v-else @click="toggleChildren">
|
||||||
|
{{ node.data.value }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #emptyNode>
|
||||||
|
<!-- TODO: Implement -->
|
||||||
|
<div>Empty Node!</div>
|
||||||
|
</template>
|
||||||
|
</HoppSmartTree>
|
||||||
|
|
||||||
|
<HoppSmartTree v-show="!searchText" :adapter="treeAdapter">
|
||||||
<template
|
<template
|
||||||
#content="{ highlightChildren, isOpen, node, toggleChildren }"
|
#content="{ highlightChildren, isOpen, node, toggleChildren }"
|
||||||
>
|
>
|
||||||
@@ -248,7 +354,7 @@
|
|||||||
import * as E from "fp-ts/lib/Either"
|
import * as E from "fp-ts/lib/Either"
|
||||||
|
|
||||||
import { useService } from "dioc/vue"
|
import { useService } from "dioc/vue"
|
||||||
import { markRaw, nextTick, ref } from "vue"
|
import { markRaw, nextTick, ref, watch } from "vue"
|
||||||
|
|
||||||
import { HoppCollection, HoppRESTAuth, HoppRESTRequest } from "@hoppscotch/data"
|
import { HoppCollection, HoppRESTAuth, HoppRESTRequest } from "@hoppscotch/data"
|
||||||
import { cloneDeep, isEqual } from "lodash-es"
|
import { cloneDeep, isEqual } from "lodash-es"
|
||||||
@@ -282,6 +388,7 @@ import { RESTTabService } from "~/services/tab/rest"
|
|||||||
import IconImport from "~icons/lucide/folder-down"
|
import IconImport from "~icons/lucide/folder-down"
|
||||||
import IconHelpCircle from "~icons/lucide/help-circle"
|
import IconHelpCircle from "~icons/lucide/help-circle"
|
||||||
import IconPlus from "~icons/lucide/plus"
|
import IconPlus from "~icons/lucide/plus"
|
||||||
|
import { WorkspaceRESTSearchCollectionTreeAdapter } from "~/helpers/adapters/WorkspaceRESTCollectionSearchTreeAdapter"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
const toast = useToast()
|
const toast = useToast()
|
||||||
@@ -336,6 +443,12 @@ const editingChildCollectionName = ref<string>("")
|
|||||||
const editingRequestName = ref<string>("")
|
const editingRequestName = ref<string>("")
|
||||||
const editingRequestIndexPath = ref<string>("")
|
const editingRequestIndexPath = ref<string>("")
|
||||||
|
|
||||||
|
const filteredCollections = ref<HoppCollection[]>([])
|
||||||
|
|
||||||
|
const searchTreeAdapter = new WorkspaceRESTSearchCollectionTreeAdapter(
|
||||||
|
filteredCollections
|
||||||
|
)
|
||||||
|
|
||||||
const editingProperties = ref<{
|
const editingProperties = ref<{
|
||||||
collection: Omit<HoppCollection, "v"> | TeamCollection | null
|
collection: Omit<HoppCollection, "v"> | TeamCollection | null
|
||||||
isRootCollection: boolean
|
isRootCollection: boolean
|
||||||
@@ -355,6 +468,32 @@ const currentUser = useReadonlyStream(
|
|||||||
platform.auth.getCurrentUser()
|
platform.auth.getCurrentUser()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => searchText.value,
|
||||||
|
async (newSearchText: string) => {
|
||||||
|
const searchResultsHandleResult =
|
||||||
|
await workspaceService.getRESTSearchResultsView(
|
||||||
|
props.workspaceHandle,
|
||||||
|
newSearchText
|
||||||
|
)
|
||||||
|
|
||||||
|
if (E.isLeft(searchResultsHandleResult)) {
|
||||||
|
filteredCollections.value = []
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchResultsHandle = searchResultsHandleResult.right
|
||||||
|
|
||||||
|
if (searchResultsHandle.value.type === "invalid") {
|
||||||
|
filteredCollections.value = []
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
filteredCollections.value = searchResultsHandle.value.data.results.value
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
const isSelected = ({
|
const isSelected = ({
|
||||||
collectionIndex,
|
collectionIndex,
|
||||||
folderPath,
|
folderPath,
|
||||||
|
|||||||
@@ -690,7 +690,7 @@ export class NewWorkspaceService extends Service {
|
|||||||
|
|
||||||
public async getRESTSearchResultsView(
|
public async getRESTSearchResultsView(
|
||||||
workspaceHandle: HandleRef<Workspace>,
|
workspaceHandle: HandleRef<Workspace>,
|
||||||
searchQuery: Ref<string>
|
searchQuery: string
|
||||||
): Promise<
|
): Promise<
|
||||||
E.Either<
|
E.Either<
|
||||||
WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">,
|
WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">,
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export interface WorkspaceProvider {
|
|||||||
): Promise<E.Either<unknown, HandleRef<RESTCollectionLevelAuthHeadersView>>>
|
): Promise<E.Either<unknown, HandleRef<RESTCollectionLevelAuthHeadersView>>>
|
||||||
getRESTSearchResultsView(
|
getRESTSearchResultsView(
|
||||||
workspaceHandle: HandleRef<Workspace>,
|
workspaceHandle: HandleRef<Workspace>,
|
||||||
searchQuery: Ref<string>
|
searchQuery: string
|
||||||
): Promise<E.Either<unknown, HandleRef<RESTSearchResultsView>>>
|
): Promise<E.Either<unknown, HandleRef<RESTSearchResultsView>>>
|
||||||
|
|
||||||
createRESTRootCollection(
|
createRESTRootCollection(
|
||||||
|
|||||||
@@ -951,7 +951,7 @@ export class PersonalWorkspaceProviderService
|
|||||||
|
|
||||||
public getRESTSearchResultsView(
|
public getRESTSearchResultsView(
|
||||||
workspaceHandle: HandleRef<Workspace>,
|
workspaceHandle: HandleRef<Workspace>,
|
||||||
searchQuery: Ref<string>
|
searchQuery: string
|
||||||
): Promise<E.Either<never, HandleRef<RESTSearchResultsView>>> {
|
): Promise<E.Either<never, HandleRef<RESTSearchResultsView>>> {
|
||||||
return Promise.resolve(
|
return Promise.resolve(
|
||||||
E.right(
|
E.right(
|
||||||
@@ -967,7 +967,7 @@ export class PersonalWorkspaceProviderService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!searchQuery.value) {
|
if (!searchQuery) {
|
||||||
return {
|
return {
|
||||||
type: "ok" as const,
|
type: "ok" as const,
|
||||||
data: {
|
data: {
|
||||||
@@ -990,7 +990,7 @@ export class PersonalWorkspaceProviderService
|
|||||||
loading: ref(false),
|
loading: ref(false),
|
||||||
|
|
||||||
results: computed(() => {
|
results: computed(() => {
|
||||||
const filterText = searchQuery.value.toLowerCase()
|
const filterText = searchQuery.toLowerCase()
|
||||||
const filteredCollections = []
|
const filteredCollections = []
|
||||||
|
|
||||||
const isMatch = (text: string) =>
|
const isMatch = (text: string) =>
|
||||||
|
|||||||
Reference in New Issue
Block a user