From 06f8b448ca5830ace66563b7de77e5508b24844f Mon Sep 17 00:00:00 2001 From: alex <48489896+devnaumov@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:43:17 +0100 Subject: [PATCH] CB-5867 show objects description (#3170) * CB-5867 show objects description * CB-5867 add description only to the connection tree --------- Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com> --- .../TreeNode/TreeNodeDescription.module.css | 11 +++++ .../src/Tree/TreeNode/TreeNodeDescription.tsx | 26 ++++++++++++ webapp/packages/core-blocks/src/index.ts | 1 + .../src/queries/fragments/NavNodeInfo.gql | 1 + .../ObjectsDescriptionSettingsForm.tsx | 42 +++++++++++++++++++ .../createElementsTreeSettings.ts | 4 +- .../ElementsTree/INavTreeNodeInfo.ts | 1 + .../NavigationNode/NavigationNodeControl.tsx | 11 ++++- .../transformDescriptionNodeInfo.ts | 25 +++++++++++ .../ElementsTree/useElementsTree.ts | 1 + .../src/NavigationTree/NavigationTree.tsx | 7 +++- .../plugin-navigation-tree/src/locales/en.ts | 1 + .../plugin-navigation-tree/src/locales/fr.ts | 1 + .../plugin-navigation-tree/src/locales/it.ts | 1 + .../plugin-navigation-tree/src/locales/ru.ts | 1 + .../plugin-navigation-tree/src/locales/zh.ts | 1 + 16 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeDescription.module.css create mode 100644 webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeDescription.tsx create mode 100644 webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/ObjectsDescriptionSettingsForm.tsx create mode 100644 webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/transformDescriptionNodeInfo.ts diff --git a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeDescription.module.css b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeDescription.module.css new file mode 100644 index 0000000000..1d4fb726e4 --- /dev/null +++ b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeDescription.module.css @@ -0,0 +1,11 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2024 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ +.description { + composes: theme-typography--caption from global; + color: var(--theme-text-hint-on-light); +} diff --git a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeDescription.tsx b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeDescription.tsx new file mode 100644 index 0000000000..b33969895f --- /dev/null +++ b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeDescription.tsx @@ -0,0 +1,26 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2024 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ +import { observer } from 'mobx-react-lite'; + +import { s } from '../../s.js'; +import { useS } from '../../useS.js'; +import classes from './TreeNodeDescription.module.css'; + +interface Props extends React.HTMLAttributes { + className?: string; +} + +export const TreeNodeDescription: React.FC = observer(function TreeNodeDescription({ className, children, ...rest }) { + const styles = useS(classes); + + return ( + + {children} + + ); +}); diff --git a/webapp/packages/core-blocks/src/index.ts b/webapp/packages/core-blocks/src/index.ts index 002ef6cadb..ef56612b57 100644 --- a/webapp/packages/core-blocks/src/index.ts +++ b/webapp/packages/core-blocks/src/index.ts @@ -131,6 +131,7 @@ export * from './Tree/TreeNode/TreeNodeControl.js'; export * from './Tree/TreeNode/TreeNodeExpand.js'; export * from './Tree/TreeNode/TreeNodeIcon.js'; export * from './Tree/TreeNode/TreeNodeName.js'; +export * from './Tree/TreeNode/TreeNodeDescription.js'; export * from './Tree/TreeNode/TreeNodeNested.js'; export * from './Tree/TreeNode/TreeNodeNestedMessage.js'; export * from './Tree/TreeNode/TreeNodeSelect.js'; diff --git a/webapp/packages/core-sdk/src/queries/fragments/NavNodeInfo.gql b/webapp/packages/core-sdk/src/queries/fragments/NavNodeInfo.gql index 0c87b6b2bc..1d1ccfc04a 100644 --- a/webapp/packages/core-sdk/src/queries/fragments/NavNodeInfo.gql +++ b/webapp/packages/core-sdk/src/queries/fragments/NavNodeInfo.gql @@ -2,6 +2,7 @@ fragment NavNodeInfo on NavigatorNodeInfo { id name plainName + description hasChildren nodeType icon diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/ObjectsDescriptionSettingsForm.tsx b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/ObjectsDescriptionSettingsForm.tsx new file mode 100644 index 0000000000..cdeb7df02e --- /dev/null +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/ObjectsDescriptionSettingsForm.tsx @@ -0,0 +1,42 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2024 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ +import { observer } from 'mobx-react-lite'; + +import { type PlaceholderComponent, type PlaceholderElement, Switch, useTranslate } from '@cloudbeaver/core-blocks'; + +import type { IElementsTreeSettingsProps } from './ElementsTreeSettingsService.js'; + +export const ObjectsDescriptionSettingsForm: PlaceholderComponent = observer(function ObjectsDescriptionSettingsForm({ + tree: { root, settings }, +}) { + const translate = useTranslate(); + + if (!settings) { + return null; + } + + return ( + + {translate('app_navigationTree_settings_filter_objects_description')} + + ); +}); + +export const ObjectsDescriptionSettingsPlaceholderElement: PlaceholderElement = { + id: 'settings-objects-description', + component: ObjectsDescriptionSettingsForm, + order: 2, +}; diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/createElementsTreeSettings.ts b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/createElementsTreeSettings.ts index ede0403de8..3652c1ef53 100644 --- a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/createElementsTreeSettings.ts +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/createElementsTreeSettings.ts @@ -17,6 +17,7 @@ export function createElementsTreeSettings(defaults?: Partial !!navNodeInfoResource.getException(node.id) || !!navTreeResource.getException(node.id)); @@ -110,6 +113,7 @@ export const NavigationNodeControl: NavTreeControlComponent = observer( let icon = nodeInfo.icon; const name = nodeInfo.name; + const description = nodeInfo.description; const title = nodeInfo.tooltip; if (error) { @@ -145,7 +149,12 @@ export const NavigationNodeControl: NavTreeControlComponent = observer( {editing ? ( ) : ( -
{name}
+
+ {name} + {elementsTreeContext?.tree.settings?.objectsDescription && description && ( + {` - ${description}`} + )} +
)} diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/transformDescriptionNodeInfo.ts b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/transformDescriptionNodeInfo.ts new file mode 100644 index 0000000000..207033a594 --- /dev/null +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/transformDescriptionNodeInfo.ts @@ -0,0 +1,25 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2024 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ +import type { NavNodeInfoResource } from '@cloudbeaver/core-navigation-tree'; + +import type { IElementsTreeCustomNodeInfo } from './useElementsTree.js'; + +export function transformDescriptionNodeInfo(navNodeInfoResource: NavNodeInfoResource): IElementsTreeCustomNodeInfo { + return function transformDescriptionNodeInfo(nodeId, info) { + const node = navNodeInfoResource.get(nodeId); + + if (node?.description && !node.folder) { + return { + ...info, + description: node.description, + }; + } + + return info; + }; +} diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTree.ts b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTree.ts index 1b397c3e98..927ff50229 100644 --- a/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTree.ts +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/ElementsTree/useElementsTree.ts @@ -77,6 +77,7 @@ export interface IElementsTreeSettings { showFolderExplorerPath: boolean; configurable: boolean; projects: boolean; + objectsDescription: boolean; } export interface IElementsTreeOptions { diff --git a/webapp/packages/plugin-navigation-tree/src/NavigationTree/NavigationTree.tsx b/webapp/packages/plugin-navigation-tree/src/NavigationTree/NavigationTree.tsx index 5f94ed089c..b0d39f5ce2 100644 --- a/webapp/packages/plugin-navigation-tree/src/NavigationTree/NavigationTree.tsx +++ b/webapp/packages/plugin-navigation-tree/src/NavigationTree/NavigationTree.tsx @@ -24,6 +24,8 @@ import { createElementsTreeSettings, validateElementsTreeSettings, } from './ElementsTree/ElementsTreeTools/NavigationTreeSettings/createElementsTreeSettings.js'; +import { ObjectsDescriptionSettingsPlaceholderElement } from './ElementsTree/ElementsTreeTools/NavigationTreeSettings/ObjectsDescriptionSettingsForm.js'; +import { transformDescriptionNodeInfo } from './ElementsTree/transformDescriptionNodeInfo.js'; import { transformFilteredNodeInfo } from './ElementsTree/transformFilteredNodeInfo.js'; import type { IElementsTreeSettings } from './ElementsTree/useElementsTree.js'; import elementsTreeToolsStyles from './ElementsTreeTools.module.css'; @@ -77,12 +79,13 @@ export const NavigationTree = observer(function NavigationTree() { [navNodeInfoResource, projectsService, projectsNavNodeService], ); const transformFilteredNode = useMemo(() => transformFilteredNodeInfo(navNodeInfoResource), [navNodeInfoResource]); + const transformDescriptionNode = useMemo(() => transformDescriptionNodeInfo(navNodeInfoResource), [navNodeInfoResource]); const projectFilter = useMemo( () => navigationTreeProjectFilter(projectsNavNodeService, projectsService, navNodeInfoResource, navTreeResource), [projectsNavNodeService, projectsService, navNodeInfoResource, navTreeResource], ); - const settingsElements = useMemo(() => [ProjectsSettingsPlaceholderElement], []); + const settingsElements = useMemo(() => [ProjectsSettingsPlaceholderElement, ObjectsDescriptionSettingsPlaceholderElement], []); return ( @@ -93,7 +96,7 @@ export const NavigationTree = observer(function NavigationTree() { filters={[duplicateFilter, connectionGroupFilter, projectFilter]} renderers={[projectsRendererRenderer, navigationTreeConnectionGroupRenderer, connectionRenderer]} navNodeFilterCompare={navigationTreeProjectSearchCompare} - nodeInfoTransformers={[transformFilteredNode]} + nodeInfoTransformers={[transformFilteredNode, transformDescriptionNode]} expandStateGetters={[projectsExpandStateGetter]} settingsElements={settingsElements} className={s(styles, { elementsTree: true })} diff --git a/webapp/packages/plugin-navigation-tree/src/locales/en.ts b/webapp/packages/plugin-navigation-tree/src/locales/en.ts index c29ccb8baa..3ce0050ba3 100644 --- a/webapp/packages/plugin-navigation-tree/src/locales/en.ts +++ b/webapp/packages/plugin-navigation-tree/src/locales/en.ts @@ -12,6 +12,7 @@ export default [ ['app_navigationTree_limited', 'Elements are limited to {arg:limit} items'], ['app_navigationTree_action_link_with_editor', 'Link with editor'], ['app_navigationTree_action_collapse_all', 'Collapse all'], + ['app_navigationTree_settings_filter_objects_description', 'Show objects description'], ['app_navigationTree_settings_filter_title', 'Filter'], ['app_navigationTree_settings_filter_description', 'Show filtering field'], ['app_navigationTree_settings_filter_all_title', 'Show collapsed'], diff --git a/webapp/packages/plugin-navigation-tree/src/locales/fr.ts b/webapp/packages/plugin-navigation-tree/src/locales/fr.ts index f8f14c4060..0c655f5333 100644 --- a/webapp/packages/plugin-navigation-tree/src/locales/fr.ts +++ b/webapp/packages/plugin-navigation-tree/src/locales/fr.ts @@ -12,6 +12,7 @@ export default [ ['app_navigationTree_limited', 'Les éléments sont limités à {arg:limit} éléments'], ['app_navigationTree_link_with_editor', "Lier avec l'éditeur"], ['app_navigationTree_action_collapse_all', 'Tout réduire'], + ['app_navigationTree_settings_filter_objects_description', 'Show objects description'], ['app_navigationTree_settings_filter_title', 'Filtrer'], ['app_navigationTree_settings_filter_description', 'Affiche les éléments filtrés dans les dossiers réduits'], ['app_navigationTree_settings_filter_all_title', 'Tout filtrer'], diff --git a/webapp/packages/plugin-navigation-tree/src/locales/it.ts b/webapp/packages/plugin-navigation-tree/src/locales/it.ts index f5ee281364..43f9ba7a4d 100644 --- a/webapp/packages/plugin-navigation-tree/src/locales/it.ts +++ b/webapp/packages/plugin-navigation-tree/src/locales/it.ts @@ -12,6 +12,7 @@ export default [ ['app_navigationTree_limited', 'Elements are limited to {arg:limit} items'], ['app_navigationTree_action_link_with_editor', 'Link with editor'], ['app_navigationTree_action_collapse_all', 'Collapse all'], + ['app_navigationTree_settings_filter_objects_description', 'Show objects description'], ['app_navigationTree_settings_filter_title', 'Filter'], ['app_navigationTree_settings_filter_description', 'Show filtering field'], ['app_navigationTree_settings_filter_all_title', 'Show collapsed'], diff --git a/webapp/packages/plugin-navigation-tree/src/locales/ru.ts b/webapp/packages/plugin-navigation-tree/src/locales/ru.ts index 565cc04503..15f97b9e16 100644 --- a/webapp/packages/plugin-navigation-tree/src/locales/ru.ts +++ b/webapp/packages/plugin-navigation-tree/src/locales/ru.ts @@ -13,6 +13,7 @@ export default [ ['app_navigationTree_action_link_with_editor', 'Синхронизовать с редактором'], ['app_navigationTree_action_collapse_all', 'Свернуть все элементы'], + ['app_navigationTree_settings_filter_objects_description', 'Показывать описание объектов'], ['app_navigationTree_settings_filter_title', 'Фильтр'], ['app_navigationTree_settings_filter_description', 'Показывать фильтр'], diff --git a/webapp/packages/plugin-navigation-tree/src/locales/zh.ts b/webapp/packages/plugin-navigation-tree/src/locales/zh.ts index bf573f317d..a4ff413d00 100644 --- a/webapp/packages/plugin-navigation-tree/src/locales/zh.ts +++ b/webapp/packages/plugin-navigation-tree/src/locales/zh.ts @@ -11,6 +11,7 @@ export default [ ['app_navigationTree_limited', '元素数量限制为 {arg:limit} '], ['app_navigationTree_action_link_with_editor', '连接至编辑器'], ['app_navigationTree_action_collapse_all', '收起全部'], + ['app_navigationTree_settings_filter_objects_description', 'Show objects description'], ['app_navigationTree_settings_filter_title', '过滤器'], ['app_navigationTree_settings_filter_description', '查看过滤字段'], ['app_navigationTree_settings_filter_all_title', '查看收缩项'],