diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index ec92a608..f5cb2f0c 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - platform: + platform: - linux/amd64 - linux/arm64 - linux/arm/v7 @@ -49,29 +49,3 @@ jobs: build-args: | VERSION=dev push: true - - manifest: - runs-on: ubuntu-latest - needs: build - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - with: - install: true - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PWD }} - - - name: Create and Push Docker Manifest - run: | - docker manifest create zilliz/attu:dev \ - zilliz/attu:dev-linux/amd64 \ - zilliz/attu:dev-linux/arm64 \ - zilliz/attu:dev-linux/arm/v7 - docker manifest push zilliz/attu:dev \ No newline at end of file diff --git a/client/src/components/DataView/DataView.tsx b/client/src/components/DataView/DataView.tsx new file mode 100644 index 00000000..84fd91b4 --- /dev/null +++ b/client/src/components/DataView/DataView.tsx @@ -0,0 +1,32 @@ +import { Typography } from '@mui/material'; +import MediaPreview from '../MediaPreview/MediaPreview'; + +const DataView = (props: { type: string; value: any }) => { + const { type, value } = props; + + switch (type) { + case 'VarChar': + return ; + case 'JSON': + case 'Array': + case 'SparseFloatVector': + case 'BFloat16Vector': + case 'FloatVector': + case 'Float16Vector': + const stringValue = JSON.stringify(value, null, 2); + // remove escape characters + const formattedValue = stringValue + .replace(/\\n/g, '\n') + .replace(/\\t/g, '\t') + .replace(/\\"/g, '"'); + + // remove first and last double quotes if present + const trimmedValue = formattedValue.replace(/^"|"$/g, ''); + return {trimmedValue}; + + default: + return {value}; + } +}; + +export default DataView; diff --git a/client/src/components/MediaPreview/MediaPreview.tsx b/client/src/components/MediaPreview/MediaPreview.tsx index 3a787b75..c2a1ca56 100644 --- a/client/src/components/MediaPreview/MediaPreview.tsx +++ b/client/src/components/MediaPreview/MediaPreview.tsx @@ -1,4 +1,5 @@ import React, { useState, useEffect } from 'react'; +import { Typography } from '@mui/material'; import icons from '../icons/Icons'; const MediaPreview = (props: { value: string }) => { @@ -100,13 +101,15 @@ const MediaPreview = (props: { value: string }) => { > {isImg ? ( <> - {' '} - - {value} - + + + + {value} + + ) : ( - value + {value} )} {showImage && ( diff --git a/client/src/pages/databases/collections/data/CollectionData.tsx b/client/src/pages/databases/collections/data/CollectionData.tsx index 9ff73f83..9525043d 100644 --- a/client/src/pages/databases/collections/data/CollectionData.tsx +++ b/client/src/pages/databases/collections/data/CollectionData.tsx @@ -1,5 +1,4 @@ import { useState, useEffect, useRef, useContext } from 'react'; -import { Typography } from '@mui/material'; import { useTranslation } from 'react-i18next'; import { rootContext, dataContext } from '@/context'; import { DataService } from '@/http'; @@ -30,7 +29,7 @@ import StatusIcon, { LoadingType } from '@/components/status/StatusIcon'; import CustomInput from '@/components/customInput/CustomInput'; import CustomMultiSelector from '@/components/customSelector/CustomMultiSelector'; import CollectionColHeader from '../CollectionColHeader'; -import MediaPreview from '@/components/MediaPreview/MediaPreview'; +import DataView from '@/components/DataView/DataView'; export interface CollectionDataProps { collectionName: string; @@ -510,17 +509,7 @@ const CollectionData = (props: CollectionDataProps) => { const fieldType = field?.data_type || 'JSON'; // dynamic - switch (fieldType) { - case 'VarChar': - return ; - case 'JSON': - const value = JSON.stringify(cellData); - return {value}; - default: - return ( - {cellData} - ); - } + return ; }, headerFormatter: v => { return ( diff --git a/client/src/pages/databases/collections/search/Search.tsx b/client/src/pages/databases/collections/search/Search.tsx index 395ef234..2d746132 100644 --- a/client/src/pages/databases/collections/search/Search.tsx +++ b/client/src/pages/databases/collections/search/Search.tsx @@ -31,7 +31,6 @@ import { buildSearchParams, buildSearchCode, getColumnWidth, - detectItemType, } from '@/utils'; import SearchParams from '../../../search/SearchParams'; import DataExplorer, { formatMilvusData } from './DataExplorer'; @@ -46,7 +45,7 @@ import { ColDefinitionsType } from '@/components/grid/Types'; import { CollectionObject, CollectionFullObject } from '@server/types'; import CodeDialog from '@/pages/dialogs/CodeDialog'; import CollectionColHeader from '../CollectionColHeader'; -import MediaPreview from '@/components/MediaPreview/MediaPreview'; +import DataView from '@/components/DataView/DataView'; export interface CollectionDataProps { collectionName: string; @@ -333,12 +332,12 @@ const Search = (props: CollectionDataProps) => { f => f.name === key ); - switch (field?.data_type) { - case 'VarChar': - return ; - default: - return {cellData}; - } + return ( + + ); }, getStyle: d => { const field = collection.schema.fields.find(