From 884744df4cbfc7187e4617d1fe3b039921654f17 Mon Sep 17 00:00:00 2001 From: Freedom <48708512+xddcode@users.noreply.github.com> Date: Thu, 20 Aug 2026 01:51:57 +0800 Subject: [PATCH] feat(meilisearch): add document and settings views --- .../src/components/common/JsonTree.vue | 67 +- .../src/components/layout/ContentArea.vue | 8 + .../meilisearch/MeilisearchDocumentsPage.vue | 801 ++++++++++++++++++ .../meilisearch/MeilisearchIndexView.vue | 145 ++++ .../meilisearch/MeilisearchSettingsPage.vue | 184 ++++ .../MeilisearchDocumentsPage.export.spec.ts | 135 +++ .../MeilisearchDocumentsPage.identity.spec.ts | 172 ++++ .../__tests__/MeilisearchSettingsPage.spec.ts | 142 ++++ .../sidebar/SidebarTreeRuntimeHost.vue | 9 +- apps/desktop/src/i18n/locales/en.ts | 54 ++ apps/desktop/src/i18n/locales/es.ts | 54 ++ apps/desktop/src/i18n/locales/it.ts | 54 ++ apps/desktop/src/i18n/locales/ja.ts | 54 ++ apps/desktop/src/i18n/locales/ko.ts | 54 ++ apps/desktop/src/i18n/locales/pt-BR.ts | 54 ++ apps/desktop/src/i18n/locales/zh-CN.ts | 54 ++ apps/desktop/src/i18n/locales/zh-TW.ts | 54 ++ apps/desktop/src/lib/backend/api.ts | 9 + apps/desktop/src/lib/backend/http.ts | 86 ++ .../lib/backend/meilisearchTransport.spec.ts | 30 + .../src/lib/backend/meilisearchTransport.ts | 63 ++ apps/desktop/src/lib/backend/tauri.ts | 95 +++ .../src/lib/common/__tests__/jsonTree.spec.ts | 11 +- apps/desktop/src/lib/common/jsonTree.ts | 31 +- .../src/lib/sidebar/sidebarActiveTabTarget.ts | 11 + apps/desktop/src/types/database.ts | 1 + crates/dbx-core/src/db/meilisearch_driver.rs | 800 ++++++++++++++++- crates/dbx-core/src/document_ops.rs | 181 ++++ crates/dbx-web/src/main.rs | 12 + crates/dbx-web/src/routes/document_store.rs | 172 ++++ src-tauri/src/commands/document_cmd.rs | 124 +++ src-tauri/src/lib.rs | 9 + 32 files changed, 3673 insertions(+), 57 deletions(-) create mode 100644 apps/desktop/src/components/meilisearch/MeilisearchDocumentsPage.vue create mode 100644 apps/desktop/src/components/meilisearch/MeilisearchIndexView.vue create mode 100644 apps/desktop/src/components/meilisearch/MeilisearchSettingsPage.vue create mode 100644 apps/desktop/src/components/meilisearch/__tests__/MeilisearchDocumentsPage.export.spec.ts create mode 100644 apps/desktop/src/components/meilisearch/__tests__/MeilisearchDocumentsPage.identity.spec.ts create mode 100644 apps/desktop/src/components/meilisearch/__tests__/MeilisearchSettingsPage.spec.ts create mode 100644 apps/desktop/src/lib/backend/meilisearchTransport.spec.ts create mode 100644 apps/desktop/src/lib/backend/meilisearchTransport.ts diff --git a/apps/desktop/src/components/common/JsonTree.vue b/apps/desktop/src/components/common/JsonTree.vue index c881c94192..5af0c3684e 100644 --- a/apps/desktop/src/components/common/JsonTree.vue +++ b/apps/desktop/src/components/common/JsonTree.vue @@ -2,7 +2,7 @@ import { computed, defineComponent, h, nextTick, ref, shallowRef, watch, type VNodeChild } from "vue"; import { DynamicScroller, DynamicScrollerItem } from "vue-virtual-scroller"; import { ChevronDown, ChevronRight } from "@lucide/vue"; -import { createJsonTreeRoot, getJsonTreeChildren, getVisibleJsonTreeNodes, isJsonTreeContainer, isJsonTreeInitiallyExpanded, jsonTreeContainerKind, jsonTreeContainerSummary, type JsonTreeNode } from "@/lib/common/jsonTree"; +import { createJsonTreeRoot, getJsonTreeChildren, getVisibleJsonTreeNodes, isJsonTreeClosingNode, isJsonTreeContainer, isJsonTreeInitiallyExpanded, jsonTreeContainerKind, jsonTreeContainerSummary, type JsonTreeNode } from "@/lib/common/jsonTree"; import { isLosslessJsonNumber } from "@/lib/common/safeJsonFormat"; defineOptions({ name: "JsonTree" }); @@ -137,12 +137,21 @@ function renderJsonNode(node: JsonTreeNode): VNodeChild { if (containerValue !== undefined) { const kind = jsonTreeContainerKind(containerValue); - rowChildren.push(h("span", { class: `json-tree-bracket is-${kind}` }, kind === "array" ? "[" : "{"), h("span", { class: "json-tree-summary" }, jsonTreeContainerSummary(containerValue, expanded)), h("span", { class: `json-tree-bracket is-${kind}` }, kind === "array" ? "]" : "}")); + rowChildren.push(h("span", { class: `json-tree-bracket is-${kind}` }, kind === "array" ? "[" : "{")); + if (!expanded) { + rowChildren.push(h("span", { class: "json-tree-summary" }, jsonTreeContainerSummary(containerValue)), h("span", { class: `json-tree-bracket is-${kind}` }, kind === "array" ? "]" : "}")); + } } else { rowChildren.push(highlightedJsonSpan(scalarClass(node.value), scalarText(node.value))); } - const children = containerValue !== undefined && expanded ? h("div", { class: "json-tree-children" }, getJsonTreeChildren(node).map(renderJsonNode)) : null; + const children = + containerValue !== undefined && expanded + ? h("div", { class: "json-tree-children" }, [ + ...getJsonTreeChildren(node).map(renderJsonNode), + h("div", { class: "json-tree-row", style: { paddingInlineStart: indent } }, [h("span", { class: `json-tree-bracket json-tree-closing is-${jsonTreeContainerKind(containerValue)}` }, jsonTreeContainerKind(containerValue) === "array" ? "]" : "}")]), + ]) + : null; return h("div", { key: node.path, class: "json-tree-node", "data-json-path": node.path }, [h("div", { class: "json-tree-row", style: { paddingInlineStart: indent } }, rowChildren), children]); } @@ -154,7 +163,7 @@ const JsonTreeRoot = defineComponent({ }, }); -const visibleNodes = computed(() => getVisibleJsonTreeNodes(rootNode.value, isNodeExpanded)); +const visibleNodes = computed(() => getVisibleJsonTreeNodes(rootNode.value, isNodeExpanded, props.virtualized)); function refresh(resetScroll = false) { if (!props.virtualized) return; @@ -180,24 +189,31 @@ defineExpose({ expandAll, collapseAll, resetExpansion, refresh });
- -