Skip to content

Commit

Permalink
fix: support editing listbox title
Browse files Browse the repository at this point in the history
  • Loading branch information
quanho committed Mar 17, 2023
1 parent b25bddc commit de7cf0a
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 5 deletions.
14 changes: 9 additions & 5 deletions apis/nucleus/src/components/listbox/ListBoxInline.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import createListboxSelectionToolbar from './interactions/listbox-selection-tool
import ActionsToolbar from '../ActionsToolbar';
import InstanceContext from '../../contexts/InstanceContext';
import ListBoxSearch from './components/ListBoxSearch';
import EditableTitle from './components/EditableTitle';
import { getListboxInlineKeyboardNavigation } from './interactions/listbox-keyboard-navigation';
import addListboxTheme from './assets/addListboxTheme';
import useAppSelections from '../../hooks/useAppSelections';
Expand Down Expand Up @@ -237,6 +238,13 @@ function ListBoxInline({ options, layout }) {
containerPadding = layoutOptions.layoutOrder === 'row' ? '2px 4px' : '2px 6px 2px 4px';
}

const titleComponent = constraints?.active ? (
<EditableTitle layout={layout} model={model} />
) : (
<Title variant="h6" noWrap ref={titleRef} title={layout.title}>
{layout.title}
</Title>
);
return (
<>
{toolbarDetachedOnly && <ActionsToolbar direction={direction} {...getActionToolbarProps(true)} />}
Expand Down Expand Up @@ -303,11 +311,7 @@ function ListBoxInline({ options, layout }) {
</Grid>
)}
<Grid item sx={{ justifyContent: isRtl ? 'flex-end' : 'flex-start' }} className={classes.listBoxHeader}>
{showTitle && (
<Title variant="h6" noWrap ref={titleRef} title={layout.title}>
{layout.title}
</Title>
)}
{showTitle && titleComponent}
</Grid>
</Grid>
<Grid item xs />
Expand Down
83 changes: 83 additions & 0 deletions apis/nucleus/src/components/listbox/components/EditableTitle.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import React, { useState, useRef } from 'react';
import { styled } from '@mui/material/styles';
import { Typography, InputBase } from '@mui/material';
import useProperties from '../../../hooks/useProperties';

const Title = styled(Typography)(({ theme }) => ({
color: theme.listBox?.title?.main?.color,
fontSize: theme.listBox?.title?.main?.fontSize,
fontFamily: theme.listBox?.title?.main?.fontFamily,
}));

const StyledInput = styled(InputBase)(({ theme }) => ({
color: theme.listBox?.title?.main?.color,
fontSize: theme.listBox?.title?.main?.fontSize,
fontFamily: theme.listBox?.title?.main?.fontFamily,
}));

export default function EditableTitle({ layout, model }) {
const [properties] = useProperties(model);
const [titleDef, setTitleDef] = useState(
properties?.title?.qStringExpression?.qExpr ? `=${properties?.title?.qStringExpression?.qExpr}` : properties?.title
);
const [isTitleFocused, setIsTitleFocused] = useState(false);
const isCanceledChange = useRef(false);

const confirmChange = () => {
if (isCanceledChange.current) {
isCanceledChange.current = false;
return;
}
model.setProperties({
...properties,
title: titleDef[0] === '=' ? { qStringExpression: { qExpr: titleDef.substr(1) } } : titleDef,
});
setIsTitleFocused(false);
};

const onClick = () => {
setTitleDef(
properties?.title?.qStringExpression?.qExpr
? `=${properties?.title?.qStringExpression?.qExpr}`
: properties?.title
);
setIsTitleFocused(true);
};

const onChange = (event) => {
setTitleDef(event.target.value);
};

const onKeyDown = (event) => {
switch (event.key) {
case 'Enter':
confirmChange();
break;
case 'Escape':
isCanceledChange.current = true;
setIsTitleFocused(false);
break;
default:
break;
}
};

return (
<div>
{!isTitleFocused ? (
<Title variant="h6" noWrap title={layout.title} onClick={onClick}>
{layout.title}
</Title>
) : (
<StyledInput
title={layout.title}
autoFocus
value={titleDef}
onChange={onChange}
onKeyDown={onKeyDown}
onBlur={() => confirmChange()}
/>
)}
</div>
);
}

0 comments on commit de7cf0a

Please sign in to comment.