diff --git a/package.json b/package.json index b2084af..298b219 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@veupathdb/coreui", - "version": "0.18.14", + "version": "0.18.15", "author": "Michael Dunn ", "description": "Core components and style definitions for VEuPath applications.", "private": false, diff --git a/src/components/inputs/SelectTree/SelectTree.tsx b/src/components/inputs/SelectTree/SelectTree.tsx index 52f79e7..de18f78 100644 --- a/src/components/inputs/SelectTree/SelectTree.tsx +++ b/src/components/inputs/SelectTree/SelectTree.tsx @@ -60,6 +60,7 @@ function SelectTree(props: SelectTreeProps) { isAdditionalFilterApplied={props.isAdditionalFilterApplied} wrapTreeSection={props.wrapTreeSection} styleOverrides={props.styleOverrides} + customTreeNodeCssSelectors={props.customTreeNodeCssSelectors} /> ) diff --git a/src/components/inputs/checkboxes/CheckboxTree/CheckboxTree.tsx b/src/components/inputs/checkboxes/CheckboxTree/CheckboxTree.tsx index daba46d..ee107b1 100644 --- a/src/components/inputs/checkboxes/CheckboxTree/CheckboxTree.tsx +++ b/src/components/inputs/checkboxes/CheckboxTree/CheckboxTree.tsx @@ -2,7 +2,7 @@ import React, { useCallback, MouseEventHandler, useMemo } from 'react'; import { css } from '@emotion/react'; import { merge } from 'lodash'; -import CheckboxTreeNode, { CustomCheckboxes, CheckboxTreeNodeStyleSpec } from './CheckboxTreeNode'; +import CheckboxTreeNode, { CustomCheckboxes, CheckboxTreeNodeStyleSpec, defaultTreeNodeStyleSpec } from './CheckboxTreeNode'; import SearchBox, { SearchBoxStyleSpec } from '../../SearchBox/SearchBox'; import { Warning } from '../../../icons'; @@ -95,7 +95,7 @@ const defaultCheckboxTreeStyleSpec: CheckboxTreeStyleSpec = { padding: '0 1em', } }, - treeNode: {}, + treeNode: defaultTreeNodeStyleSpec, } type StatefulNode = T & { @@ -222,6 +222,8 @@ export type CheckboxTreeProps = { wrapTreeSection?: (treeSection: React.ReactNode) => React.ReactNode; styleOverrides?: CheckboxTreeStyleSpec; + + customTreeNodeCssSelectors?: object; }; type TreeLinkHandler = MouseEventHandler; @@ -632,6 +634,7 @@ function CheckboxTree (props: CheckboxTreeProps) { expandedList, renderNoResults, styleOverrides = {}, + customTreeNodeCssSelectors = {}, } = props; const styleSpec: CheckboxTreeStyleSpec = useMemo(() => { @@ -825,9 +828,29 @@ function CheckboxTree (props: CheckboxTreeProps) { /> ); + const treeNodeCssSelectors = useMemo(() => { + return ({ + '.list': styleSpec.treeNode?.list, + '.visible-element': { display: '' }, + '.hidden-element': { display: 'none' }, + '.node-wrapper': {...styleSpec.treeNode?.nodeWrapper}, + '.top-level-node-wrapper': {...styleSpec.treeNode?.nodeWrapper, ...styleSpec.treeNode?.topLevelNodeWrapper}, + '.arrow-icon': { fill: '#aaa', fontSize: '0.75em', cursor: 'pointer' }, + '.label-text-wrapper': { ...styleSpec.treeNode?.labelTextWrapper }, + '.leaf-node-label': { ...styleSpec.treeNode?.leafNodeLabel }, + '.node-label': { ...styleSpec.treeNode?.nodeLabel }, + '.children': styleSpec.treeNode?.children, + '.active-search-buffer': { width: '0.75em' }, + ...customTreeNodeCssSelectors + }) + }, [styleSpec.treeNode, customTreeNodeCssSelectors]) + let treeSection = (
-
    +
      {topLevelNodes.map((node, index) => { const nodeId = getNodeId(node); @@ -848,7 +871,6 @@ function CheckboxTree (props: CheckboxTreeProps) { getNodeChildren={getStatefulChildren} renderNode={renderNode} customCheckboxes={customCheckboxes as unknown as CustomCheckboxes>} - styleOverrides={styleSpec.treeNode} isTopLevelNode={true} /> ) diff --git a/src/components/inputs/checkboxes/CheckboxTree/CheckboxTreeNode.tsx b/src/components/inputs/checkboxes/CheckboxTree/CheckboxTreeNode.tsx index bd089a0..93cdd7f 100644 --- a/src/components/inputs/checkboxes/CheckboxTree/CheckboxTreeNode.tsx +++ b/src/components/inputs/checkboxes/CheckboxTree/CheckboxTreeNode.tsx @@ -1,5 +1,4 @@ -import React, { useMemo } from 'react'; -import { merge } from 'lodash'; +import React from 'react'; import { isLeaf } from '../../SelectTree/Utils'; import IndeterminateCheckbox, { IndeterminateCheckboxProps } from '../IndeterminateCheckbox'; import { ArrowRight, ArrowDown } from '../../../icons'; @@ -19,7 +18,7 @@ export type CheckboxTreeNodeStyleSpec = { labelTextWrapper?: React.CSSProperties; }; -const defaultStyleSpec: CheckboxTreeNodeStyleSpec = { +export const defaultTreeNodeStyleSpec: CheckboxTreeNodeStyleSpec = { list: { listStyle: 'none', }, @@ -50,9 +49,6 @@ const defaultStyleSpec: CheckboxTreeNodeStyleSpec = { } } -const visibleElement = { display: '' }; -const hiddenElement = { display: 'none' }; - type TreeRadioProps = { name: string; checked: boolean; @@ -110,7 +106,6 @@ type Props = { renderNode: (node: T, path?: number[]) => React.ReactNode; customCheckboxes?: CustomCheckboxes; shouldExpandOnClick: boolean; - styleOverrides?: CheckboxTreeNodeStyleSpec; isTopLevelNode?: boolean; } @@ -129,18 +124,12 @@ export default function CheckboxTreeNode({ renderNode, customCheckboxes, shouldExpandOnClick, - styleOverrides = {}, isTopLevelNode = false, }: Props ) { - const styleSpec: CheckboxTreeNodeStyleSpec = useMemo(() => { - return merge({}, defaultStyleSpec, styleOverrides) - }, [styleOverrides]) let { isSelected, isIndeterminate, isVisible, isExpanded } = getNodeState(node); let isLeafNode = isLeaf(node, getNodeChildren); - let nodeVisibilityCss = isVisible ? visibleElement : hiddenElement; - let childrenVisibilityCss = isExpanded ? visibleElement : hiddenElement; let inputName = isLeafNode ? name : ''; let nodeId = getNodeId(node); const nodeElement = renderNode(node, path); @@ -154,23 +143,22 @@ export default function CheckboxTreeNode({ const CustomCheckbox = (customCheckboxes && (nodeId in customCheckboxes)) ? customCheckboxes[nodeId] : undefined; return ( -
    • +
    • {isLeafNode ? null : isActiveSearch ? ( // this retains the space of the expansion toggle icons for easier formatting -
      +
      ) : ( isExpanded ? { e.stopPropagation(); @@ -179,7 +167,7 @@ export default function CheckboxTreeNode({ onKeyDown={(e) => e.key === 'Enter' ? toggleExpansion(node) : null} /> : { e.stopPropagation(); @@ -190,15 +178,15 @@ export default function CheckboxTreeNode({ )} {!isSelectable || (!isMultiPick && !isLeafNode) ? (
      toggleExpansion(node) : undefined} > {nodeElement}
      ) : ( -
      { !isLeafNode && isVisible && isExpanded && -
        +
          {getNodeChildren(node).map((child, index) => ({ getNodeChildren={getNodeChildren} renderNode={renderNode} customCheckboxes={customCheckboxes} - styleOverrides={styleOverrides} /> + /> )}
        }