UNPKG

model-navigator-standalone

Version:

Standalone MDF graph model visualizer

195 lines (183 loc) 6.16 kB
/* eslint-disable max-len */ /* eslint-disable react/forbid-prop-types */ import React, { useContext } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import CloseRoundedIcon from '@mui/icons-material/CloseRounded'; import IconButton from '@mui/material/IconButton'; import withStyles from '@mui/styles/withStyles'; import _ from 'lodash'; import { getNodeDescriptionFragment, getNodeTitleFragment, } from '../../Utils/highlightHelper'; import { selectIsSearchMode, selectMatchedResult, } from '../../../../../features/search/searchSlice'; import { changedVisOverlayPropTable, selectHighlightingMatchedNodeID, } from '../../../../../features/graph/graphSlice'; import {defaultStyleAttributes} from '../../../Config/nav.config'; import { ConfigContext } from '../../../Config/ConfigContext'; import { ModelContext } from '../../../Model/ModelContext'; import DataDictionaryPropertyTable from "../../Table/DataDictionaryPropertyTable"; import styles from "./OverlayPropertyTable.style"; import NodeViewComponent from "../../Table/DataDictionaryNode/components/NodeViewComponent"; const OverlayPropertyTable = ({ classes, nodeID, hidden, }) => { const dispatch = useDispatch(); const config = useContext( ConfigContext ); const model = useContext( ModelContext ); const isSearchMode = useSelector(selectIsSearchMode); const node = nodeID ? model.nodes( nodeID ) : null; // eslint-disable-line no-undef const matchedNodeID = useSelector( selectHighlightingMatchedNodeID ); const matchedResult = useSelector( state => selectMatchedResult(state, matchedNodeID) ); const getTitle = () => { if (isSearchMode) { if (matchedResult) { return getNodeTitleFragment(matchedResult.matches, _.capitalize(node.handle), "overlay-property-table__span"); } } return _.capitalize(node.handle); }; const getDescription = () => { if (isSearchMode) { if (matchedResult) { return getNodeDescriptionFragment(matchedResult.matches, node.description, "overlay-property-table__span"); } } return node.description; }; /** * Toggle the property table to display all properties */ const handleOpenAllProperties = () => { // this.props.onOpenMatchedProperties(); }; /** * Toggle the property table to display matched properties only */ const handleDisplayOnlyMatchedProperties = () => { // this.props.onCloseMatchedProperties(); }; const needHighlightSearchResult = isSearchMode; if (!node || hidden ) { // !node || hidden) { return ( <></> ); } const category = node.tags('Category') ? node.tags('Category') : null; const catConfig = category ? config.tagAttribute('Category', category) : null; const borderLeftColor = category ? catConfig?.table?.color : defaultStyleAttributes.node.color; const backgroundColor = category ? catConfig?.node?.background : defaultStyleAttributes.node.background; const tableIcon = category ? (catConfig?.table?.icon ? catConfig?.table?.icon : defaultStyleAttributes.table.icon) : defaultStyleAttributes.table.icon; return ( <div className={classes.table}> <div className={classes.background} /> <div className={classes.fixedContainer}> <div className={classes.content}> <div className={classes.header}> <div className={classes.category} style={{ borderLeftColor, backgroundColor }} > <div style={{ display: "flex", alignItems: "center", gap: "8px", paddingLeft: '4px' }} > <img src={tableIcon} alt="icon" className={classes.categoryIcon} /> { category ? ( <h4 style={{ color: "#FFF" }} className={classes.categoryText} > {_.capitalize(category)} </h4> ) : ( <> </> )} </div> <div> <IconButton className={classes.iconCloseRounded} onClick={() => dispatch(changedVisOverlayPropTable("hide"))} size="large"> <CloseRoundedIcon style={{ color: "#FFF", fontSize: "20px" }} /> </IconButton> </div> </div> </div> <div className={classes.categoryDivider} style={{ borderLeftColor }} /> <div className={classes.node} style={{ borderLeftColor, marginBottom: "0px", borderRight: "1px solid #ADBEC4", backgroundColor: "white", }} > <NodeViewComponent node={node} description={node.desc} matchedResult={matchedResult} propertyCount={node.props().length} isOverlay={true} /> </div> <div className={classes.propertyTable} style={{ borderLeftColor }} > <div className={classes.property}> <DataDictionaryPropertyTable title={getTitle()} node={node} onlyShowMatchedProperties={false} needHighlightSearchResult={needHighlightSearchResult} hideIsRequired={false} matchedResult={matchedResult} /> </div> </div> </div> </div> </div> ); } export default withStyles(styles)(OverlayPropertyTable);