From d6be186958fec5c9d896131c336dc69b5fda07f6 Mon Sep 17 00:00:00 2001 From: Aniket Katkar Date: Mon, 16 Oct 2023 16:21:41 +0530 Subject: [PATCH] fix(ui): fqn encoding issue on customizable landing page (#13577) * Fixed the issue with the encoded fqn passed to the layout data on customizable landing page Added success and fail toasts after saving the layouts * localization changes for other languages * Added missing widget images * fixed code smells --- .../resources/ui/src/assets/img/kpi-small.png | Bin 0 -> 35956 bytes .../ui/src/assets/img/total-assets-medium.png | Bin 0 -> 20389 bytes .../CustomizeMyData.interface.ts | 1 + .../CustomizeMyData/CustomizeMyData.tsx | 9 +-- .../RightSidebar/AnnouncementsWidget.tsx | 2 +- .../RightSidebar/RightSidebar.component.tsx | 4 +- .../RightSidebar/RightSidebar.interface.ts | 1 + .../ui/src/locale/languages/de-de.json | 4 ++ .../ui/src/locale/languages/en-us.json | 4 ++ .../ui/src/locale/languages/es-es.json | 4 ++ .../ui/src/locale/languages/fr-fr.json | 4 ++ .../ui/src/locale/languages/ja-jp.json | 4 ++ .../ui/src/locale/languages/pt-br.json | 4 ++ .../ui/src/locale/languages/ru-ru.json | 4 ++ .../ui/src/locale/languages/zh-cn.json | 4 ++ .../CustomizablePage/CustomizablePage.tsx | 59 +++++++++++++++--- .../main/resources/ui/src/rest/DocStoreAPI.ts | 9 ++- .../src/main/resources/ui/src/styles/app.less | 2 +- .../src/utils/CustomizableLandingPageUtils.ts | 9 ++- .../ui/src/utils/CustomizePageClassBase.ts | 6 +- 20 files changed, 108 insertions(+), 26 deletions(-) create mode 100644 openmetadata-ui/src/main/resources/ui/src/assets/img/kpi-small.png create mode 100644 openmetadata-ui/src/main/resources/ui/src/assets/img/total-assets-medium.png diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/img/kpi-small.png b/openmetadata-ui/src/main/resources/ui/src/assets/img/kpi-small.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bd5ce2a89b5bed49ae93b5ba2340bbec7e7837 GIT binary patch literal 35956 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

aU5RAvVT-jx;hH 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 Hu0mjfcu7{a literal 0 HcmV?d00001 diff --git a/openmetadata-ui/src/main/resources/ui/src/components/CustomizableComponents/CustomizeMyData/CustomizeMyData.interface.ts b/openmetadata-ui/src/main/resources/ui/src/components/CustomizableComponents/CustomizeMyData/CustomizeMyData.interface.ts index e7c7fd1d7ce..6a1febb1f27 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/CustomizableComponents/CustomizeMyData/CustomizeMyData.interface.ts +++ b/openmetadata-ui/src/main/resources/ui/src/components/CustomizableComponents/CustomizeMyData/CustomizeMyData.interface.ts @@ -17,4 +17,5 @@ export interface CustomizeMyDataProps { initialPageData: Document; onSaveLayout: () => Promise; handlePageDataChange: (newPageData: Document) => void; + handleSaveCurrentPageLayout: (value: boolean) => void; } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/CustomizableComponents/CustomizeMyData/CustomizeMyData.tsx b/openmetadata-ui/src/main/resources/ui/src/components/CustomizableComponents/CustomizeMyData/CustomizeMyData.tsx index 01102f6152c..ee207ef4157 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/CustomizableComponents/CustomizeMyData/CustomizeMyData.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/CustomizableComponents/CustomizeMyData/CustomizeMyData.tsx @@ -61,6 +61,7 @@ function CustomizeMyData({ initialPageData, onSaveLayout, handlePageDataChange, + handleSaveCurrentPageLayout, }: Readonly) { const { t } = useTranslation(); const history = useHistory(); @@ -210,6 +211,7 @@ function CustomizeMyData({ followedData={followedData ?? []} followedDataCount={followedDataCount} handleResetLayout={handleResetRightPanelLayout} + handleSaveCurrentPageLayout={handleSaveCurrentPageLayout} isAnnouncementLoading={isAnnouncementLoading} isLoadingOwnedData={isLoadingOwnedData} layoutConfigData={widgetConfig.data} @@ -318,11 +320,6 @@ function CustomizeMyData({ ); }, []); - const handleSave = useCallback(async () => { - await onSaveLayout(); - handleCancel(); - }, [onSaveLayout]); - const handleReset = useCallback(() => { setLayout([ ...customizePageClassBase.landingPageDefaultLayout, @@ -377,7 +374,7 @@ function CustomizeMyData({ - diff --git a/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/AnnouncementsWidget.tsx b/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/AnnouncementsWidget.tsx index 75b2a7ac17c..287e147b1ab 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/AnnouncementsWidget.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/AnnouncementsWidget.tsx @@ -38,7 +38,7 @@ function AnnouncementsWidget({ }, [widgetKey]); return ( -

+
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/RightSidebar.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/RightSidebar.component.tsx index 26172bfeeb5..727288b5982 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/RightSidebar.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/RightSidebar.component.tsx @@ -42,6 +42,7 @@ const RightSidebar = ({ updateParentLayout, resetLayout = false, handleResetLayout, + handleSaveCurrentPageLayout, }: RightSidebarProps) => { const [layout, setLayout] = useState>([ ...(layoutConfigData?.page?.layout ?? []), @@ -205,7 +206,7 @@ const RightSidebar = ({ }, [layout]); useEffect(() => { - if (resetLayout && handleResetLayout) { + if (resetLayout && handleResetLayout && handleSaveCurrentPageLayout) { setLayout([ ...customizePageClassBase.rightPanelDefaultLayout, ...(isEditView @@ -222,6 +223,7 @@ const RightSidebar = ({ : []), ]); handleResetLayout(false); + handleSaveCurrentPageLayout(true); } }, [resetLayout]); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/RightSidebar.interface.ts b/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/RightSidebar.interface.ts index 738b2951783..b3173c77f9d 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/RightSidebar.interface.ts +++ b/openmetadata-ui/src/main/resources/ui/src/components/MyData/RightSidebar/RightSidebar.interface.ts @@ -27,4 +27,5 @@ export interface RightSidebarProps { layoutConfigData?: WidgetConfig['data']; parentLayoutData?: Array; updateParentLayout?: (newLayout: Array) => void; + handleSaveCurrentPageLayout?: (value: boolean) => void; } 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 4c2eecf1f71..a0011a6dd50 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 @@ -195,6 +195,7 @@ "created-date": "Erstellungsdatum", "created-lowercase": "erstellt", "creating-account": "Konto erstellen", + "creating-lowercase": "creating", "credentials-type": "Anmeldeinformationstyp", "criteria": "Kriterien", "cron": "Cron", @@ -1070,6 +1071,7 @@ "updated-by": "Aktualisiert von", "updated-lowercase": "aktualisiert", "updated-on": "Aktualisiert am", + "updating-lowercase": "updating", "upload-csv-uppercase-file": "CSV-Datei hochladen", "upstream-depth": "Upstream-Tiefe", "url-lowercase": "URL", @@ -1615,6 +1617,8 @@ "no-query-available": "Keine Abfrage verfügbar.", "no-task-available": "Keine Aufgabendaten verfügbar.", "no-task-creation-without-assignee": "Es kann keine Aufgabe ohne Beauftragten erstellt werden.", + "page-layout-operation-error": "Error while {{operation}} the page layout.", + "page-layout-operation-success": "Page layout {{operation}} successfully.", "please-add-description": "Eine leere Beschreibung wird nicht akzeptiert. Bitte fügen Sie eine Beschreibung hinzu.", "please-add-tags": "Eine leere Tag-Liste wird nicht akzeptiert. Bitte fügen Sie einen Tag hinzu.", "re-indexing-error": "Fehler beim Re-Indexieren!", 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 bf1db9ab3bf..11d961ecdad 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 @@ -195,6 +195,7 @@ "created-date": "Created Date", "created-lowercase": "created", "creating-account": "Creating Account", + "creating-lowercase": "creating", "credentials-type": "Credentials Type", "criteria": "Criteria", "cron": "Cron", @@ -1070,6 +1071,7 @@ "updated-by": "Updated by", "updated-lowercase": "updated", "updated-on": "Updated on", + "updating-lowercase": "updating", "upload-csv-uppercase-file": "Upload CSV file", "upstream-depth": "Upstream Depth", "url-lowercase": "url", @@ -1615,6 +1617,8 @@ "no-query-available": "No query available.", "no-task-available": "No task data is available.", "no-task-creation-without-assignee": "Cannot create a task without assignee", + "page-layout-operation-error": "Error while {{operation}} the page layout.", + "page-layout-operation-success": "Page layout {{operation}} successfully.", "please-add-description": "Empty description is not accepted. Please add a description.", "please-add-tags": "An empty tag list is not accepted. Please add a tag.", "re-indexing-error": "Error while re indexing!", 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 f1b385a48a4..3045dafa2e3 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 @@ -195,6 +195,7 @@ "created-date": "Created Date", "created-lowercase": "creado", "creating-account": "Creando cuenta", + "creating-lowercase": "creating", "credentials-type": "Tipo de credenciales", "criteria": "Criterio", "cron": "Cron", @@ -1070,6 +1071,7 @@ "updated-by": "Actualizado por", "updated-lowercase": "actualizado", "updated-on": "Actualizado el", + "updating-lowercase": "updating", "upload-csv-uppercase-file": "Cargar archivo CSV", "upstream-depth": "Profundidad aguas arriba", "url-lowercase": "url", @@ -1615,6 +1617,8 @@ "no-query-available": "No hay consulta disponible.", "no-task-available": "No hay datos de tarea disponibles.", "no-task-creation-without-assignee": "No se puede crear una tarea sin destinatario", + "page-layout-operation-error": "Error while {{operation}} the page layout.", + "page-layout-operation-success": "Page layout {{operation}} successfully.", "please-add-description": "No se acepta una descripción vacía. Por favor agregue una descripción.", "please-add-tags": "No se acepta una lista de etiquetas vacía. Por favor agregue una etiqueta.", "re-indexing-error": "Error while re indexing!", 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 7bb8adad115..4d6b72b3bd5 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 @@ -195,6 +195,7 @@ "created-date": "Date de Création", "created-lowercase": "créé", "creating-account": "Création du Compte", + "creating-lowercase": "creating", "credentials-type": "Type d'Identifiants", "criteria": "Critères", "cron": "Cron", @@ -1070,6 +1071,7 @@ "updated-by": "Mis à Jour par", "updated-lowercase": "mis à jour", "updated-on": "Mis à Jour le", + "updating-lowercase": "updating", "upload-csv-uppercase-file": "Télécharger le Fichier CSV", "upstream-depth": "Profondeur de l'Amont", "url-lowercase": "url", @@ -1615,6 +1617,8 @@ "no-query-available": "Aucune requête disponible", "no-task-available": "Aucune donnée n'est disponible pour les tâches", "no-task-creation-without-assignee": "Impossible de créer une tâche sans destinataire", + "page-layout-operation-error": "Error while {{operation}} the page layout.", + "page-layout-operation-success": "Page layout {{operation}} successfully.", "please-add-description": "La description vide n'est pas acceptée. Veuillez ajouter une description.", "please-add-tags": "Impossible d'accepter une liste de tags vide. Veuillez ajouter un tag.", "re-indexing-error": "Erreur lors du réindexage !", 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 fc28166a701..a97cdda9496 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 @@ -195,6 +195,7 @@ "created-date": "Created Date", "created-lowercase": "作成済", "creating-account": "アカウントの作成", + "creating-lowercase": "creating", "credentials-type": "Credentials Type", "criteria": "クライテリア", "cron": "Cron", @@ -1070,6 +1071,7 @@ "updated-by": "Updated by", "updated-lowercase": "updated", "updated-on": "Updated on", + "updating-lowercase": "updating", "upload-csv-uppercase-file": "CSVファイルをアップロード", "upstream-depth": "Upstream Depth", "url-lowercase": "url", @@ -1615,6 +1617,8 @@ "no-query-available": "利用可能なクエリはありません。", "no-task-available": "タスク情報はありません。", "no-task-creation-without-assignee": "担当者のいないタスクは作成できません", + "page-layout-operation-error": "Error while {{operation}} the page layout.", + "page-layout-operation-success": "Page layout {{operation}} successfully.", "please-add-description": "空の説明は受け付けられません。説明を追加してください。", "please-add-tags": "空のタグリストは受け付けられません。タグを追加してください。", "re-indexing-error": "Error while re indexing!", 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 50dacf33d7b..25a0ae13da6 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 @@ -195,6 +195,7 @@ "created-date": "Created Date", "created-lowercase": "criado", "creating-account": "Criando conta", + "creating-lowercase": "creating", "credentials-type": "Tipo de credenciais", "criteria": "Critério", "cron": "Cron", @@ -1070,6 +1071,7 @@ "updated-by": "Atualizado por", "updated-lowercase": "atualizado", "updated-on": "Atualizado em", + "updating-lowercase": "updating", "upload-csv-uppercase-file": "Enviar arquivo CSV", "upstream-depth": "Profundidade a montante", "url-lowercase": "url", @@ -1615,6 +1617,8 @@ "no-query-available": "Nenhuma consulta disponível.", "no-task-available": "Não há dados de tarefa disponíveis.", "no-task-creation-without-assignee": "Não é possível criar uma tarefa sem destinatário", + "page-layout-operation-error": "Error while {{operation}} the page layout.", + "page-layout-operation-success": "Page layout {{operation}} successfully.", "please-add-description": "Descrição vazia não é aceita. Por favor, adicione uma descrição.", "please-add-tags": "Uma lista de tags vazia não é aceita. Por favor, adicione uma tag.", "re-indexing-error": "Error while re indexing!", 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 2117a9fa502..a9a23607025 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 @@ -195,6 +195,7 @@ "created-date": "Дата создания", "created-lowercase": "создано", "creating-account": "Создание аккаунта", + "creating-lowercase": "creating", "credentials-type": "Тип учетных данных", "criteria": "Критерий", "cron": "Крон", @@ -1070,6 +1071,7 @@ "updated-by": "Обновлено", "updated-lowercase": "обновлено", "updated-on": "Обновление", + "updating-lowercase": "updating", "upload-csv-uppercase-file": "Загрузить CSV-файл", "upstream-depth": "Восходящая линия", "url-lowercase": "url", @@ -1615,6 +1617,8 @@ "no-query-available": "Нет доступных запросов.", "no-task-available": "Данных о задании нет.", "no-task-creation-without-assignee": "Невозможно создать задачу без исполнителя", + "page-layout-operation-error": "Error while {{operation}} the page layout.", + "page-layout-operation-success": "Page layout {{operation}} successfully.", "please-add-description": "Пустое описание не принимается. Пожалуйста, добавьте описание.", "please-add-tags": "Пустой список тегов не принимается. Пожалуйста, добавьте тег.", "re-indexing-error": "Ошибка при переиндексации!", 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 1a4a8a6f8a8..8604b3e8bd2 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 @@ -195,6 +195,7 @@ "created-date": "创建日期", "created-lowercase": "创建", "creating-account": "注册帐号", + "creating-lowercase": "creating", "credentials-type": "凭证类型", "criteria": "标准", "cron": "Cron", @@ -1070,6 +1071,7 @@ "updated-by": "更新者", "updated-lowercase": "已更新", "updated-on": "更新于", + "updating-lowercase": "updating", "upload-csv-uppercase-file": "上传 CSV 文件", "upstream-depth": "上游深度", "url-lowercase": "url", @@ -1615,6 +1617,8 @@ "no-query-available": "没有可用的查询", "no-task-available": "没有任务数据可用", "no-task-creation-without-assignee": "无法创建没有受派人的任务", + "page-layout-operation-error": "Error while {{operation}} the page layout.", + "page-layout-operation-success": "Page layout {{operation}} successfully.", "please-add-description": "不接受空描述,请添加描述信息", "please-add-tags": "不接受空标签列表,请添加标签信息", "re-indexing-error": "在重新索引时发生错误!", diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/CustomizablePage/CustomizablePage.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/CustomizablePage/CustomizablePage.tsx index f0d230d689a..66255d453d8 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/CustomizablePage/CustomizablePage.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/CustomizablePage/CustomizablePage.tsx @@ -12,7 +12,8 @@ */ import { AxiosError } from 'axios'; import { compare } from 'fast-json-patch'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { useParams } from 'react-router-dom'; import CustomizeMyData from '../../components/CustomizableComponents/CustomizeMyData/CustomizeMyData'; import Loader from '../../components/Loader/Loader'; @@ -27,22 +28,37 @@ import { } from '../../rest/DocStoreAPI'; import { getFinalLandingPage } from '../../utils/CustomizableLandingPageUtils'; import customizePageClassBase from '../../utils/CustomizePageClassBase'; +import { getDecodedFqn } from '../../utils/StringsUtils'; +import { showErrorToast, showSuccessToast } from '../../utils/ToastUtils'; export const CustomizablePage = () => { - const { fqn, pageFqn } = useParams<{ fqn: string; pageFqn: PageType }>(); + const { fqn: personaFQN, pageFqn } = + useParams<{ fqn: string; pageFqn: PageType }>(); + const { t } = useTranslation(); const [page, setPage] = useState({} as Document); const [editedPage, setEditedPage] = useState({} as Document); const [isLoading, setIsLoading] = useState(true); + const [saveCurrentPageLayout, setSaveCurrentPageLayout] = useState(false); + + const decodedPersonaFQN = useMemo( + () => getDecodedFqn(personaFQN), + [personaFQN] + ); + const decodedPageFQN = useMemo(() => getDecodedFqn(pageFqn), [pageFqn]); const handlePageDataChange = useCallback((newPageData: Document) => { setEditedPage(newPageData); }, []); + const handleSaveCurrentPageLayout = useCallback((value: boolean) => { + setSaveCurrentPageLayout(value); + }, []); + const fetchDocument = async () => { - const pageFQN = `${EntityType.PERSONA}.${fqn}.${EntityType.PAGE}.${pageFqn}`; + const pageLayoutFQN = `${EntityType.PERSONA}.${personaFQN}.${EntityType.PAGE}.${pageFqn}`; try { setIsLoading(true); - const pageData = await getDocumentByFQN(pageFQN); + const pageData = await getDocumentByFQN(pageLayoutFQN); const finalPageData = getFinalLandingPage(pageData, true); setPage(finalPageData); @@ -52,8 +68,8 @@ export const CustomizablePage = () => { setPage( getFinalLandingPage( { - name: `${fqn}${pageFqn}`, - fullyQualifiedName: pageFQN, + name: `${decodedPersonaFQN}${decodedPageFQN}`, + fullyQualifiedName: getDecodedFqn(pageLayoutFQN), entityType: EntityType.PAGE, data: { page: { @@ -73,22 +89,46 @@ export const CustomizablePage = () => { const handleSave = async () => { try { const finalPage = getFinalLandingPage(editedPage); + let response: Document; if (page.id) { const jsonPatch = compare(page, finalPage); - await updateDocument(page?.id ?? '', jsonPatch); + response = await updateDocument(page.id ?? '', jsonPatch); } else { - await createDocument(finalPage); + response = await createDocument(finalPage); } + setPage(response); + setEditedPage(response); + showSuccessToast( + t('server.page-layout-operation-success', { + operation: page.id + ? t('label.updated-lowercase') + : t('label.created-lowercase'), + }) + ); } catch { // Error + showErrorToast( + t('server.page-layout-operation-error', { + operation: page.id + ? t('label.updating-lowercase') + : t('label.creating-lowercase'), + }) + ); } }; + useEffect(() => { + if (saveCurrentPageLayout) { + handleSave(); + setSaveCurrentPageLayout(false); + } + }, [saveCurrentPageLayout]); + useEffect(() => { fetchDocument(); - }, [fqn, pageFqn]); + }, [personaFQN, pageFqn]); if (isLoading) { return ; @@ -98,6 +138,7 @@ export const CustomizablePage = () => { return ( diff --git a/openmetadata-ui/src/main/resources/ui/src/rest/DocStoreAPI.ts b/openmetadata-ui/src/main/resources/ui/src/rest/DocStoreAPI.ts index 3ba3797b00f..7c7b8843edc 100644 --- a/openmetadata-ui/src/main/resources/ui/src/rest/DocStoreAPI.ts +++ b/openmetadata-ui/src/main/resources/ui/src/rest/DocStoreAPI.ts @@ -49,11 +49,10 @@ export const updateDocument = async (id: string, data: Operation[]) => { const configOptions = { headers: { 'Content-type': 'application/json-patch+json' }, }; - const response = await axiosClient.patch( - `${BASE_URL}/${id}`, - data, - configOptions - ); + const response = await axiosClient.patch< + Operation[], + AxiosResponse + >(`${BASE_URL}/${id}`, data, configOptions); return response.data; }; diff --git a/openmetadata-ui/src/main/resources/ui/src/styles/app.less b/openmetadata-ui/src/main/resources/ui/src/styles/app.less index 8522b2765ae..ac50233f9ee 100644 --- a/openmetadata-ui/src/main/resources/ui/src/styles/app.less +++ b/openmetadata-ui/src/main/resources/ui/src/styles/app.less @@ -501,7 +501,7 @@ a[href].link-text-grey, .no-scrollbar { scrollbar-width: none; - ::-webkit-scrollbar { + &::-webkit-scrollbar { display: none; } } diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/CustomizableLandingPageUtils.ts b/openmetadata-ui/src/main/resources/ui/src/utils/CustomizableLandingPageUtils.ts index bcd127ae1b0..41692e84934 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/CustomizableLandingPageUtils.ts +++ b/openmetadata-ui/src/main/resources/ui/src/utils/CustomizableLandingPageUtils.ts @@ -51,7 +51,7 @@ export const getAddWidgetHandler = placeholderWidgetKey === LandingPageWidgetKeys.EMPTY_WIDGET_PLACEHOLDER ) { return [ - ...currentLayout, + ...moveEmptyWidgetToTheEnd(currentLayout), { w: widgetWidth, h: widgetHeight, @@ -95,6 +95,13 @@ const getEmptyWidgetHeight = ( } }; +export const moveEmptyWidgetToTheEnd = (layout: Array) => + layout.map((widget) => + widget.i === LandingPageWidgetKeys.EMPTY_WIDGET_PLACEHOLDER + ? { ...widget, y: 100 } + : widget + ); + export const getRemoveWidgetHandler = (widgetKey: string, minHeight: number, maxHeight: number) => (currentLayout: Array) => { diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/CustomizePageClassBase.ts b/openmetadata-ui/src/main/resources/ui/src/utils/CustomizePageClassBase.ts index 7c2f5076a20..c0f707411d3 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/CustomizePageClassBase.ts +++ b/openmetadata-ui/src/main/resources/ui/src/utils/CustomizePageClassBase.ts @@ -15,9 +15,11 @@ import { FC } from 'react'; import ActivityFeedImg from '../assets/img/activity-feed.png'; import AnnouncementImg from '../assets/img/announcement.png'; import FollowingImg from '../assets/img/following.png'; +import KPISmallImg from '../assets/img/kpi-small.png'; import KPIImg from '../assets/img/kpi.png'; import MyDataImg from '../assets/img/my-data.png'; import RecentViewsImg from '../assets/img/recent-views.png'; +import TotalAssetsMediumImg from '../assets/img/total-assets-medium.png'; import TotalAssetsImg from '../assets/img/total-assets.png'; import KPIWidget from '../components/KPIWidget/KPIWidget.component'; import { MyDataWidget } from '../components/MyData/MyDataWidget/MyDataWidget.component'; @@ -198,14 +200,14 @@ class CustomizePageClassBase { } case LandingPageWidgetKeys.KPI: { if (size === WidgetWidths.small) { - return ''; + return KPISmallImg; } return KPIImg; } case LandingPageWidgetKeys.TOTAL_DATA_ASSETS: { if (size === WidgetWidths.medium) { - return ''; + return TotalAssetsMediumImg; } return TotalAssetsImg;