| // Components | // Components | ||||
| import ExternalAPIPanel from '../../components/datasets/external-api/external-api-panel' | import ExternalAPIPanel from '../../components/datasets/external-api/external-api-panel' | ||||
| import Datasets from './Datasets' | |||||
| import DatasetFooter from './DatasetFooter' | |||||
| import Datasets from './datasets' | |||||
| import DatasetFooter from './dataset-footer' | |||||
| import ApiServer from '../../components/develop/ApiServer' | import ApiServer from '../../components/develop/ApiServer' | ||||
| import Doc from './Doc' | |||||
| import Doc from './doc' | |||||
| import TabSliderNew from '@/app/components/base/tab-slider-new' | import TabSliderNew from '@/app/components/base/tab-slider-new' | ||||
| import TagManagementModal from '@/app/components/base/tag-management' | import TagManagementModal from '@/app/components/base/tag-management' | ||||
| import TagFilter from '@/app/components/base/tag-management/filter' | import TagFilter from '@/app/components/base/tag-management/filter' |
| </div> | </div> | ||||
| <div | <div | ||||
| className={cn( | className={cn( | ||||
| 'mb-2 max-h-[72px] grow px-[14px] text-xs leading-normal text-text-tertiary group-hover:line-clamp-2 group-hover:max-h-[36px]', | |||||
| tags.length ? 'line-clamp-2' : 'line-clamp-4', | |||||
| 'mb-2 line-clamp-2 max-h-[36px] grow px-[14px] text-xs leading-normal text-text-tertiary', | |||||
| !dataset.embedding_available && 'opacity-50 hover:opacity-100', | !dataset.embedding_available && 'opacity-50 hover:opacity-100', | ||||
| )} | )} | ||||
| title={dataset.description}> | title={dataset.description}> | ||||
| {dataset.description} | {dataset.description} | ||||
| </div> | </div> | ||||
| <div className={cn( | |||||
| 'mt-4 h-[42px] shrink-0 items-center pb-[6px] pl-[14px] pr-[6px] pt-1', | |||||
| tags.length ? 'flex' : '!hidden group-hover:!flex', | |||||
| )}> | |||||
| <div className='mt-4 flex h-[42px] shrink-0 items-center pb-[6px] pl-[14px] pr-[6px] pt-1'> | |||||
| <div className={cn('flex w-0 grow items-center gap-1', !dataset.embedding_available && 'opacity-50 hover:opacity-100')} onClick={(e) => { | <div className={cn('flex w-0 grow items-center gap-1', !dataset.embedding_available && 'opacity-50 hover:opacity-100')} onClick={(e) => { | ||||
| e.stopPropagation() | e.stopPropagation() | ||||
| e.preventDefault() | e.preventDefault() | ||||
| }}> | }}> | ||||
| <div className={cn( | <div className={cn( | ||||
| 'mr-[41px] w-full grow group-hover:!mr-0 group-hover:!block', | |||||
| tags.length ? '!block' : '!hidden', | |||||
| 'mr-[41px] w-full grow group-hover:!mr-0', | |||||
| )}> | )}> | ||||
| <TagSelector | <TagSelector | ||||
| position='bl' | position='bl' |
| import { useCallback, useEffect, useRef } from 'react' | import { useCallback, useEffect, useRef } from 'react' | ||||
| import useSWRInfinite from 'swr/infinite' | import useSWRInfinite from 'swr/infinite' | ||||
| import { debounce } from 'lodash-es' | import { debounce } from 'lodash-es' | ||||
| import NewDatasetCard from './NewDatasetCard' | |||||
| import DatasetCard from './DatasetCard' | |||||
| import NewDatasetCard from './new-dataset-card' | |||||
| import DatasetCard from './dataset-card' | |||||
| import type { DataSetListResponse, FetchDatasetsParams } from '@/models/datasets' | import type { DataSetListResponse, FetchDatasetsParams } from '@/models/datasets' | ||||
| import { fetchDatasets } from '@/service/datasets' | import { fetchDatasets } from '@/service/datasets' | ||||
| import { useAppContext } from '@/context/app-context' | import { useAppContext } from '@/context/app-context' |
| 'use client' | 'use client' | ||||
| import { useTranslation } from 'react-i18next' | import { useTranslation } from 'react-i18next' | ||||
| import Container from './Container' | |||||
| import Container from './container' | |||||
| import useDocumentTitle from '@/hooks/use-document-title' | import useDocumentTitle from '@/hooks/use-document-title' | ||||
| const AppList = () => { | const AppList = () => { |
| {app.description} | {app.description} | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div className={cn( | |||||
| 'absolute bottom-1 left-0 right-0 h-[42px] shrink-0 items-center pb-[6px] pl-[14px] pr-[6px] pt-1', | |||||
| tags.length ? 'flex' : '!hidden group-hover:!flex', | |||||
| )}> | |||||
| <div className='absolute bottom-1 left-0 right-0 flex h-[42px] shrink-0 items-center pb-[6px] pl-[14px] pr-[6px] pt-1'> | |||||
| {isCurrentWorkspaceEditor && ( | {isCurrentWorkspaceEditor && ( | ||||
| <> | <> | ||||
| <div className={cn('flex w-0 grow items-center gap-1')} onClick={(e) => { | <div className={cn('flex w-0 grow items-center gap-1')} onClick={(e) => { | ||||
| e.stopPropagation() | e.stopPropagation() | ||||
| e.preventDefault() | e.preventDefault() | ||||
| }}> | }}> | ||||
| <div className={cn( | |||||
| 'mr-[41px] w-full grow group-hover:!mr-0 group-hover:!block', | |||||
| tags.length ? '!block' : '!hidden', | |||||
| )}> | |||||
| <div className='mr-[41px] w-full grow group-hover:!mr-0'> | |||||
| <TagSelector | <TagSelector | ||||
| position='bl' | position='bl' | ||||
| type='app' | type='app' | ||||
| /> | /> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div className='mx-1 !hidden h-[14px] w-[1px] shrink-0 group-hover:!flex' /> | |||||
| <div className='mx-1 !hidden h-[14px] w-[1px] shrink-0 bg-divider-regular group-hover:!flex' /> | |||||
| <div className='!hidden shrink-0 group-hover:!flex'> | <div className='!hidden shrink-0 group-hover:!flex'> | ||||
| <CustomPopover | <CustomPopover | ||||
| htmlContent={<Operations />} | htmlContent={<Operations />} |
| }, [selectedTags, tagList]) | }, [selectedTags, tagList]) | ||||
| const Trigger = () => { | const Trigger = () => { | ||||
| const hasNoTags = !triggerContent | |||||
| return ( | return ( | ||||
| <div className={cn( | <div className={cn( | ||||
| 'group/tip relative flex w-full cursor-pointer items-center gap-1 rounded-md px-2 py-[7px] hover:bg-state-base-hover', | 'group/tip relative flex w-full cursor-pointer items-center gap-1 rounded-md px-2 py-[7px] hover:bg-state-base-hover', | ||||
| )}> | )}> | ||||
| <Tag01 className='h-3 w-3 shrink-0 text-components-input-text-placeholder' /> | <Tag01 className='h-3 w-3 shrink-0 text-components-input-text-placeholder' /> | ||||
| <div className='system-sm-regular grow truncate text-start text-components-input-text-placeholder'> | |||||
| <div className={cn( | |||||
| 'system-sm-regular grow truncate text-start', | |||||
| hasNoTags ? 'italic text-components-input-text-placeholder' : 'font-medium text-components-input-text-placeholder', | |||||
| )}> | |||||
| {!triggerContent ? t('common.tag.addTag') : triggerContent} | {!triggerContent ? t('common.tag.addTag') : triggerContent} | ||||
| </div> | </div> | ||||
| </div> | </div> |
| }) | }) | ||||
| } | } | ||||
| export const useGetUserCanAccessApp = ({ appId, isInstalledApp = true }: { appId?: string; isInstalledApp?: boolean; }) => { | |||||
| export const useGetUserCanAccessApp = ({ appId, isInstalledApp = true, enabled }: { appId?: string; isInstalledApp?: boolean; enabled?: boolean }) => { | |||||
| const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) | ||||
| return useQuery({ | return useQuery({ | ||||
| queryKey: [NAME_SPACE, 'user-can-access-app', appId], | queryKey: [NAME_SPACE, 'user-can-access-app', appId], | ||||
| else | else | ||||
| return { result: true } | return { result: true } | ||||
| }, | }, | ||||
| enabled: !!appId, | |||||
| enabled: enabled !== undefined ? enabled : !!appId, | |||||
| staleTime: 0, | staleTime: 0, | ||||
| gcTime: 0, | gcTime: 0, | ||||
| }) | }) |