diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AppRouter/withAdvanceSearch.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AppRouter/withAdvanceSearch.tsx index 3098df133874..19b05f55ec23 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AppRouter/withAdvanceSearch.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AppRouter/withAdvanceSearch.tsx @@ -14,8 +14,8 @@ import React, { FC } from 'react'; import { AdvanceSearchProvider } from '../../components/Explore/AdvanceSearchProvider/AdvanceSearchProvider.component'; export const withAdvanceSearch = - (Component: FC) => - (props: JSX.IntrinsicAttributes & { children?: React.ReactNode }) => { +

>(Component: FC

) => + (props: P) => { return ( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.interface.ts b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.interface.ts new file mode 100644 index 000000000000..68543369c9bb --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.interface.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2024 Collate. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export enum QueryBuilderOutputType { + ELASTICSEARCH = 'elasticsearch', + JSON_LOGIC = 'jsonlogic', +} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.test.tsx new file mode 100644 index 000000000000..44b0b3895c49 --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.test.tsx @@ -0,0 +1,75 @@ +/* + * Copyright 2024 Collate. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Registry } from '@rjsf/utils'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { BasicConfig } from 'react-awesome-query-builder'; +import AntdConfig from 'react-awesome-query-builder/lib/config/antd'; +import QueryBuilderWidget from './QueryBuilderWidget'; + +const mockOnFocus = jest.fn(); +const mockOnBlur = jest.fn(); +const mockOnChange = jest.fn(); +const baseConfig = AntdConfig as BasicConfig; + +jest.mock( + '../../../../../Explore/AdvanceSearchProvider/AdvanceSearchProvider.component', + () => ({ + AdvanceSearchProvider: ({ children }: { children: React.ReactNode }) => ( +

{children}
+ ), + useAdvanceSearch: jest.fn().mockImplementation(() => ({ + toggleModal: jest.fn(), + sqlQuery: '', + onResetAllFilters: jest.fn(), + onChangeSearchIndex: jest.fn(), + config: { + ...baseConfig, + fields: {}, + }, + })), + }) +); + +jest.mock('react-router-dom', () => ({ + useLocation: jest.fn(), +})); + +const mockProps = { + onFocus: mockOnFocus, + onBlur: mockOnBlur, + onChange: mockOnChange, + registry: {} as Registry, + schema: { + description: 'this is query builder field', + title: 'rules', + format: 'queryBuilder', + entityType: 'table', + }, + value: '', + id: 'root/queryBuilder', + label: 'Query Builder', + name: 'queryBuilder', + options: { + enumOptions: [], + }, +}; + +describe('QueryBuilderWidget', () => { + it('should render the query builder', () => { + render(); + const builder = screen.getByTestId('query-builder-form-field'); + + expect(builder).toBeInTheDocument(); + }); +}); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.tsx new file mode 100644 index 000000000000..0e1b04275e7e --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget.tsx @@ -0,0 +1,159 @@ +/* + * Copyright 2024 Collate. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { InfoCircleOutlined } from '@ant-design/icons'; +import { WidgetProps } from '@rjsf/utils'; +import { Alert, Button, Col, Typography } from 'antd'; +import { t } from 'i18next'; +import { debounce, isEmpty, isUndefined } from 'lodash'; +import Qs from 'qs'; +import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { + Builder, + Config, + ImmutableTree, + Query, + Utils as QbUtils, +} from 'react-awesome-query-builder'; +import { getExplorePath } from '../../../../../../constants/constants'; +import { EntityType } from '../../../../../../enums/entity.enum'; +import { SearchIndex } from '../../../../../../enums/search.enum'; +import { searchQuery } from '../../../../../../rest/searchAPI'; +import searchClassBase from '../../../../../../utils/SearchClassBase'; +import { withAdvanceSearch } from '../../../../../AppRouter/withAdvanceSearch'; +import { useAdvanceSearch } from '../../../../../Explore/AdvanceSearchProvider/AdvanceSearchProvider.component'; +import './query-builder-widget.less'; +import { QueryBuilderOutputType } from './QueryBuilderWidget.interface'; + +const QueryBuilderWidget: FC = ({ + onChange, + schema, + value, + ...props +}: WidgetProps) => { + const { config, treeInternal, onTreeUpdate, onChangeSearchIndex } = + useAdvanceSearch(); + const [searchResults, setSearchResults] = useState(0); + const entityType = + (props.formContext?.entityType ?? props?.entityType) || EntityType.ALL; + const searchIndexMapping = searchClassBase.getEntityTypeSearchIndexMapping(); + const searchIndex = searchIndexMapping[entityType as string]; + const outputType = props?.outputType ?? QueryBuilderOutputType.ELASTICSEARCH; + + const fetchEntityCount = useCallback( + async (queryFilter: Record) => { + try { + const res = await searchQuery({ + query: '', + pageNumber: 0, + pageSize: 0, + queryFilter, + searchIndex: SearchIndex.ALL, + includeDeleted: false, + trackTotalHits: true, + fetchSource: false, + }); + setSearchResults(res.hits.total.value ?? 0); + } catch (_) { + // silent fail + } + }, + [] + ); + + const debouncedFetchEntityCount = useMemo( + () => debounce(fetchEntityCount, 300), + [fetchEntityCount] + ); + + const queryURL = useMemo(() => { + const queryFilterString = !isEmpty(treeInternal) + ? Qs.stringify({ queryFilter: JSON.stringify(treeInternal) }) + : ''; + + return `${getExplorePath({})}${queryFilterString}`; + }, [treeInternal]); + + const handleChange = (nTree: ImmutableTree, nConfig: Config) => { + onTreeUpdate(nTree, nConfig); + + if (outputType === QueryBuilderOutputType.ELASTICSEARCH) { + const data = QbUtils.elasticSearchFormat(nTree, config) ?? {}; + const qFilter = { + query: data, + }; + if (data) { + debouncedFetchEntityCount(qFilter); + } + + onChange(JSON.stringify(qFilter)); + } else { + const data = QbUtils.jsonLogicFormat(nTree, config); + onChange(JSON.stringify(data.logic ?? '{}')); + } + }; + + useEffect(() => { + onChangeSearchIndex(searchIndex); + }, [searchIndex]); + + return ( +
+ ( +
+ +
+ )} + value={treeInternal} + onChange={handleChange} + /> + {outputType === QueryBuilderOutputType.ELASTICSEARCH && + !isUndefined(value) && ( + + + + )} +
+ ); +}; + +export default withAdvanceSearch(QueryBuilderWidget); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/query-builder-widget.less b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/query-builder-widget.less new file mode 100644 index 000000000000..43d768729e2a --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/query-builder-widget.less @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Collate. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.query-builder-form-field { + .hide--line.one--child { + margin-top: 0; + padding-top: 16px; + } + + .group.rule_group { + border: none !important; + padding: 0; + + .group--children { + padding-top: 0; + padding-bottom: 0; + margin: 0; + } + } + + .group--field { + width: 180px; + + .ant-select { + width: 100% !important; + } + + label { + font-weight: normal; + margin-bottom: 6px; + } + } +} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/FormBuilder/FormBuilder.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/FormBuilder/FormBuilder.tsx index 23f624f7fa26..8f4cb2b608f6 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/FormBuilder/FormBuilder.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/FormBuilder/FormBuilder.tsx @@ -27,6 +27,7 @@ import { FieldErrorTemplate } from '../Form/JSONSchema/JSONSchemaTemplate/FieldE import { ObjectFieldTemplate } from '../Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate'; import AsyncSelectWidget from '../Form/JSONSchema/JsonSchemaWidgets/AsyncSelectWidget'; import PasswordWidget from '../Form/JSONSchema/JsonSchemaWidgets/PasswordWidget'; +import QueryBuilderWidget from '../Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget'; import SelectWidget from '../Form/JSONSchema/JsonSchemaWidgets/SelectWidget'; import Loader from '../Loader/Loader'; @@ -70,6 +71,7 @@ const FormBuilder: FunctionComponent = forwardRef( const widgets = { PasswordWidget: PasswordWidget, autoComplete: AsyncSelectWidget, + queryBuilder: QueryBuilderWidget, ...(useSelectWidget && { SelectWidget: SelectWidget }), }; diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json index 80ed7d544338..7ede75ac2c73 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "Can not add the widget to this section due to size restrictions.", "can-you-add-a-description": "Können Sie eine Beschreibung hinzufügen?", "checkout-service-connectors-doc": "Es gibt viele Konnektoren hier, um Daten von Ihren Diensten zu indizieren. Bitte schauen Sie sich unsere Konnektoren an.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "Klicken Sie auf <0>{{text}}, um Details anzuzeigen.", "closed-this-task": "hat diese Aufgabe geschlossen", "collaborate-with-other-user": "um mit anderen Benutzern zusammenzuarbeiten.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "Die Planung kann im stündlichen, täglichen oder wöchentlichen Rhythmus eingerichtet werden. Die Zeitzone ist UTC.", "scheduled-run-every": "Geplant, alle auszuführen", "scopes-comma-separated": "Fügen Sie den Wert der Bereiche hinzu, getrennt durch Kommata", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "Suche nach Pipeline, StoredProcedures", "search-for-entity-types": "Suche nach Tabellen, Themen, Dashboards, Pipelines, ML-Modellen, Glossar und Tags.", "search-for-ingestion": "Suche nach Ingestion", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json index 199086f4be32..7cf7279dd766 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "Can not add the widget to this section due to size restrictions.", "can-you-add-a-description": "Can you add a description?", "checkout-service-connectors-doc": "There are a lot of connectors available here to index data from your services. Please checkout our connectors.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "Click <0>{{text}} to view details.", "closed-this-task": "closed this task", "collaborate-with-other-user": "to collaborate with other users.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "Scheduling can be set up at an hourly, daily, or weekly cadence. The timezone is in UTC.", "scheduled-run-every": "Scheduled to run every", "scopes-comma-separated": "Add the Scopes value, separated by commas", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "Search for Pipeline, StoredProcedures", "search-for-entity-types": "Search for Tables, Topics, Dashboards, Pipelines, ML Models, Glossary and Tags.", "search-for-ingestion": "Search for ingestion", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json index c8b01b31475e..a7b6c3eb2ea1 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "No se puede agregar el widget a esta sección debido a restricciones de tamaño.", "can-you-add-a-description": "¿Puedes agregar una descripción?", "checkout-service-connectors-doc": "Hay muchos conectores disponibles para ingesta de datos de tus servicios. Por favor, revisa nuestra documentación sobre conectores.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "Haz clic en <0>{{text}} para ver detalles.", "closed-this-task": "cerró esta tarea", "collaborate-with-other-user": "para colaborar con otros usuarios.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "La programación se puede configurar en una cadencia horaria, diaria o semanal.", "scheduled-run-every": "Programado para ejecutarse cada", "scopes-comma-separated": "Agrega el valor de ámbitos, separados por comas", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "Buscar Pipeline, StoredProcedures", "search-for-entity-types": "Buscar Tablas, Temas, Paneles, Pipelines, Modelos de ML, Glosarios y Etiquetas.", "search-for-ingestion": "Buscar orígenes de datos", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json index 700cc2a946ce..f7c323534b53 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "Le widget ne peut être ajouté à cette section à cause des restrictions de taille.$", "can-you-add-a-description": "Pouvez-vous ajouter une description?", "checkout-service-connectors-doc": "Il y a de nombreux connecteurs disponibles ici pour indexer les données de vos services. Veuillez consulter nos connecteurs.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "Cliquez sur <0>{{text}} pour voir les détails.", "closed-this-task": "fermer cette tâche", "collaborate-with-other-user": "pour collaborer avec d'autres utilisateurs.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "La programmation peut être configurée à une cadence horaire, quotidienne ou hebdomadaire. Le fuseau horaire est en UTC.", "scheduled-run-every": "Programmer pour être exécuté tous les", "scopes-comma-separated": "Liste de scopes séparée par une virgule.", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "Rechercher Pipeline, Procédures Stockées", "search-for-entity-types": "Rechercher Tables, Topics, Tableaux de Bord, Pipelines et Modèles d'IA", "search-for-ingestion": "Rechercher une ingestion", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json index 6e799c49c284..7e6b4580c659 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "לא ניתן להוסיף את הווידג'ט לסקשן זה עקב הגבלות בגודל.", "can-you-add-a-description": "האם תוכל להוסיף תיאור?", "checkout-service-connectors-doc": "ישנם חיבורים רבים כאן זמינים לאינדקסציה של נתונים מהשירותים שלך. בדוק את החיבורים שלנו.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "לחץ על <0>{{text}} לצפייה בפרטים.", "closed-this-task": "סגר משימה זו", "collaborate-with-other-user": "לשתף פעולה עם משתמשים אחרים.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "ניתן להגדיר שימוש כל שעה, יומית או שבועית. אזור הזמן הוא UTC.", "scheduled-run-every": "מתוזמן לרוץ כל", "scopes-comma-separated": "הוסף את ערכי הניקוד, מופרדים בפסיקים", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "חיפוש לפי תהליך טעינה, פונקציות מאוחסנות", "search-for-entity-types": "חיפוש לפי טבלאות, נושאים, דשבורדים, תהליכי טעינה, מודלי למידת מכונה, מילוני מונחים ותגיות", "search-for-ingestion": "חיפוש תהליך טעינה (Ingestion)", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json index ae9b24c9baf9..b810ae443db0 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "Can not add the widget to this section due to size restrictions.", "can-you-add-a-description": "説明を追加できますか?", "checkout-service-connectors-doc": "There are a lot of connectors available here to index data from your services. Please checkout our connectors.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "Click <0>{{text}} to view details.", "closed-this-task": "このタスクを閉じました", "collaborate-with-other-user": "to collaborate with other users.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "Scheduling can be set up at an hourly, daily, or weekly cadence. The timezone is in UTC.", "scheduled-run-every": "Scheduled to run every", "scopes-comma-separated": "スコープの値をカンマで区切って追加", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "Search for Pipeline, StoredProcedures", "search-for-entity-types": "テーブル、トピック、ダッシュボード、パイプライン、MLモデルの検索。", "search-for-ingestion": "Search for ingestion", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json index 1b34e364d97c..9a8df974dc79 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "Kan de widget niet toevoegen aan deze sectie vanwege beperkingen in grootte.", "can-you-add-a-description": "Kunt u een beschrijving toevoegen?", "checkout-service-connectors-doc": "Er zijn hier veel connectors beschikbaar om data van uw services te indexeren. Bekijk onze connectors.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "Klik op <0>{{text}} om details te bekijken.", "closed-this-task": "heeft deze taak gesloten", "collaborate-with-other-user": "om samen te werken met andere gebruikers.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "Planning kan worden ingesteld op een uurlijkse, dagelijkse of wekelijkse cadans. De tijdzone is in UTC.", "scheduled-run-every": "Gepland om elke keer uit te voeren", "scopes-comma-separated": "Voeg de herkomstwaarde toe, gescheiden door komma's", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "Zoeken naar Pipeline, Stored Procedures", "search-for-entity-types": "Zoeken naar Tabellen, Onderwerpen, Dashboards, Pipelines, ML-modellen, Woordenlijst en Tags.", "search-for-ingestion": "Zoeken naar ingestie", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json index 83666f2f87d3..219d7edd97d7 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "به دلیل محدودیت‌های اندازه، نمی‌توان ویجت را به این بخش اضافه کرد.", "can-you-add-a-description": "آیا می‌توانید توضیحی اضافه کنید؟", "checkout-service-connectors-doc": "اینجا تعدادی از اتصالات برای ایندکس کردن داده‌ها از خدمات خود موجود است. لطفاً مستندات ما را بررسی کنید.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "برای مشاهده جزئیات، روی <0>{{text}} کلیک کنید.", "closed-this-task": "این وظیفه را بست.", "collaborate-with-other-user": "برای همکاری با کاربران دیگر.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "برنامه‌ریزی می‌تواند به صورت ساعتی، روزانه یا هفتگی تنظیم شود. منطقه زمانی UTC است.", "scheduled-run-every": "برنامه‌ریزی شده برای اجرا هر", "scopes-comma-separated": "مقدار Scopes را با کاما جدا کنید.", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "جستجوی خطوط لوله، StoredProcedures.", "search-for-entity-types": "جستجوی جداول، موضوعات، داشبوردها، خطوط لوله، مدل‌های ML، واژه‌نامه و برچسب‌ها.", "search-for-ingestion": "جستجوی ورود داده.", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json index eb1baa9f4613..d10839ef589b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "Não é possível adicionar o widget a esta seção devido a restrições de tamanho.", "can-you-add-a-description": "Você pode adicionar uma descrição?", "checkout-service-connectors-doc": "Há muitos conectores disponíveis aqui para indexar dados de seus serviços. Por favor, confira nossos conectores.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "Clique em <0>{{text}} para ver detalhes.", "closed-this-task": "fechou esta tarefa", "collaborate-with-other-user": "para colaborar com outros usuários.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "O agendamento pode ser configurado em uma frequência horária, diária ou semanal. O fuso horário é em UTC.", "scheduled-run-every": "Agendado para rodar a cada", "scopes-comma-separated": "Adicione o valor dos Escopos, separados por vírgulas", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "Pesquisar por Pipeline, StoredProcedures", "search-for-entity-types": "Pesquisar por Tabelas, Tópicos, Painéis, Pipelines, Modelos de ML, Glossário e Tags.", "search-for-ingestion": "Pesquisar por ingestão", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json index 28a568ab50c4..c057687dc212 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "Can not add the widget to this section due to size restrictions.", "can-you-add-a-description": "Можете добавить описание?", "checkout-service-connectors-doc": "Здесь доступно множество коннекторов для индексации данных из ваших сервисов. Пожалуйста, ознакомьтесь с нашими коннекторами.", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "Нажмите <0>{{text}}, чтобы просмотреть подробности.", "closed-this-task": "задача закрыта", "collaborate-with-other-user": "для совместной работы с другими пользователями.", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "Планирование может быть настроено на почасовой, ежедневной или еженедельной частоте. Часовой пояс указан в формате UTC.", "scheduled-run-every": "Запланирован запуск каждый", "scopes-comma-separated": "Добавьте значение областей, разделенное запятыми", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "Search for Pipeline, StoredProcedures", "search-for-entity-types": "Поиск по таблицам, топикам, дашбордам, пайплайнам, моделям машинного обучения, глоссарию и тегам.", "search-for-ingestion": "Поиск для получения", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json index ef3a93128a21..b3d2e527c351 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json @@ -1393,6 +1393,7 @@ "can-not-add-widget": "Can not add the widget to this section due to size restrictions.", "can-you-add-a-description": "您能添加一些描述吗?", "checkout-service-connectors-doc": "我们已经预置了很多连接器, 可用于索引您的各项服务数据", + "click-here-to-view-assets-on-explore": "(Click to view the filtered assets on Explore page.)", "click-text-to-view-details": "点击<0>{{text}}查看详情", "closed-this-task": "关闭了此任务", "collaborate-with-other-user": "与其他用户协作", @@ -1782,6 +1783,7 @@ "schedule-for-ingestion-description": "可设置每小时、每天或每周的计划, 时区为 UTC", "scheduled-run-every": "计划每次运行", "scopes-comma-separated": "范围值逗号分隔", + "search-entity-count": "{{count}} assets have been found with this filter.", "search-for-edge": "搜索工作流、存储过程", "search-for-entity-types": "搜索数据表、消息主题、仪表板、工作流和机械学习模型", "search-for-ingestion": "搜索提取作业",