ElementsList: Add separators and add parity background color
This commit is contained in:
parent
982a066770
commit
2c5a617b3a
1 changed files with 57 additions and 30 deletions
|
@ -27,13 +27,17 @@ interface IElementsSidebarProps {
|
||||||
onExpandChange: (value: ExtendedSidebar) => void
|
onExpandChange: (value: ExtendedSidebar) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
function RemoveBorderClasses(target: HTMLButtonElement, exception: string = ''): void {
|
function RemoveBorderClasses(target: HTMLElement, exception: string = ''): void {
|
||||||
const bordersClasses = ['border-t-8', 'border-8', 'border-b-8'].filter(className => className !== exception);
|
const bordersClasses = ['border-t-8', 'border-8', 'border-b-8'].filter(className => className !== exception);
|
||||||
target.classList.remove(...bordersClasses);
|
target.classList.remove(...bordersClasses);
|
||||||
}
|
}
|
||||||
|
|
||||||
function HandleDragLeave(event: React.DragEvent): void {
|
function HandleDragLeave(event: React.DragEvent): void {
|
||||||
const target: HTMLButtonElement = event.target as HTMLButtonElement;
|
let target: HTMLButtonElement = event.target as HTMLButtonElement;
|
||||||
|
|
||||||
|
if (target.classList.contains('list-vertical-bar')) {
|
||||||
|
target = target.parentElement as HTMLButtonElement;
|
||||||
|
}
|
||||||
|
|
||||||
RemoveBorderClasses(target);
|
RemoveBorderClasses(target);
|
||||||
}
|
}
|
||||||
|
@ -43,7 +47,11 @@ function HandleDragOver(
|
||||||
mainContainer: IContainerModel
|
mainContainer: IContainerModel
|
||||||
): void {
|
): void {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
const target: HTMLButtonElement = event.target as HTMLButtonElement;
|
let target = event.target as HTMLElement;
|
||||||
|
|
||||||
|
if (target.classList.contains('list-vertical-bar')) {
|
||||||
|
target = target.parentElement as HTMLButtonElement;
|
||||||
|
}
|
||||||
|
|
||||||
const rect = target.getBoundingClientRect();
|
const rect = target.getBoundingClientRect();
|
||||||
const y = event.clientY - rect.top; // y position within the element.
|
const y = event.clientY - rect.top; // y position within the element.
|
||||||
|
@ -73,7 +81,12 @@ function HandleOnDrop(
|
||||||
): void {
|
): void {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
const type = event.dataTransfer.getData('type');
|
const type = event.dataTransfer.getData('type');
|
||||||
const target: HTMLButtonElement = event.target as HTMLButtonElement;
|
let target: HTMLButtonElement = event.target as HTMLButtonElement;
|
||||||
|
|
||||||
|
if (target.classList.contains('list-vertical-bar')) {
|
||||||
|
target = target.parentElement as HTMLButtonElement;
|
||||||
|
}
|
||||||
|
|
||||||
RemoveBorderClasses(target);
|
RemoveBorderClasses(target);
|
||||||
|
|
||||||
const targetContainer: IContainerModel | undefined = FindContainerById(
|
const targetContainer: IContainerModel | undefined = FindContainerById(
|
||||||
|
@ -132,6 +145,7 @@ export function ElementsSidebar(props: IElementsSidebarProps): JSX.Element {
|
||||||
// States
|
// States
|
||||||
const divRef = React.useRef<HTMLDivElement>(null);
|
const divRef = React.useRef<HTMLDivElement>(null);
|
||||||
const [,height] = useSize(divRef);
|
const [,height] = useSize(divRef);
|
||||||
|
console.log(height);
|
||||||
|
|
||||||
// Render
|
// Render
|
||||||
const it = MakeRecursionDFSIterator(props.mainContainer, props.containers, 0, [0, 0], true);
|
const it = MakeRecursionDFSIterator(props.mainContainer, props.containers, 0, [0, 0], true);
|
||||||
|
@ -155,6 +169,7 @@ export function ElementsSidebar(props: IElementsSidebarProps): JSX.Element {
|
||||||
return (
|
return (
|
||||||
ElementsListRow(
|
ElementsListRow(
|
||||||
key,
|
key,
|
||||||
|
index,
|
||||||
container,
|
container,
|
||||||
depth,
|
depth,
|
||||||
isSelected,
|
isSelected,
|
||||||
|
@ -208,6 +223,7 @@ export function ElementsSidebar(props: IElementsSidebarProps): JSX.Element {
|
||||||
|
|
||||||
function ElementsListRow(
|
function ElementsListRow(
|
||||||
key: string,
|
key: string,
|
||||||
|
index: number,
|
||||||
container: IContainerModel,
|
container: IContainerModel,
|
||||||
depth: number,
|
depth: number,
|
||||||
isSelected: boolean,
|
isSelected: boolean,
|
||||||
|
@ -219,28 +235,37 @@ function ElementsListRow(
|
||||||
selectContainer: (containerId: string) => void
|
selectContainer: (containerId: string) => void
|
||||||
): JSX.Element {
|
): JSX.Element {
|
||||||
const verticalBars: JSX.Element[] = [];
|
const verticalBars: JSX.Element[] = [];
|
||||||
const verticalBarSelectedClass = isSelected
|
|
||||||
? 'border-l-blue-400 group-hover:border-l-blue-300'
|
let buttonClass = 'bg-blue-500 shadow-lg shadow-blue-500/60' +
|
||||||
: 'border-l-slate-400 group-hover:border-l-slate-300';
|
' hover:bg-blue-600 hover:shadow-blue-500 text-slate-50 border-blue-600';
|
||||||
|
let verticalBarClass = 'border-l-blue-400 group-hover:border-l-blue-300';
|
||||||
|
if (!isSelected) {
|
||||||
|
const isPair = (index & 1) === 0;
|
||||||
|
if (isPair) {
|
||||||
|
buttonClass = 'bg-slate-300/20 border-slate-500/50';
|
||||||
|
} else {
|
||||||
|
buttonClass = 'bg-slate-400/30 border-slate-500/80';
|
||||||
|
}
|
||||||
|
|
||||||
|
verticalBarClass = 'border-l-slate-400 group-hover:border-l-slate-300';
|
||||||
|
buttonClass += ' hover:bg-slate-400 hover:shadow-slate-400';
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < depth; i++) {
|
for (let i = 0; i < depth; i++) {
|
||||||
verticalBars.push(<span
|
verticalBars.push(<span
|
||||||
key={`${key}-${i}`}
|
key={`${key}-${i}`}
|
||||||
className={`h-full border-l-2 pr-2 ${verticalBarSelectedClass}`}
|
className={`list-vertical-bar h-full border-l-2 pr-1 ${verticalBarClass}`}
|
||||||
></span>);
|
></span>);
|
||||||
}
|
}
|
||||||
|
|
||||||
const buttonSelectedClass: string = isSelected
|
return <div style={style}>
|
||||||
? 'bg-blue-500 shadow-lg shadow-blue-500/60 hover:bg-blue-600 border-blue-600 hover:shadow-blue-500 text-slate-50'
|
<button type="button"
|
||||||
: 'bg-slate-300/60 hover:bg-slate-400 hover:shadow-slate-400';
|
className={`transition-all h-[38px]
|
||||||
|
|
||||||
return <button type="button"
|
|
||||||
className={`transition-all border-blue-500
|
|
||||||
hover:shadow-lg elements-sidebar-row whitespace-pre
|
hover:shadow-lg elements-sidebar-row whitespace-pre
|
||||||
text-left text-sm font-medium flex items-center align-middle group
|
text-left text-sm font-medium flex items-center align-middle group
|
||||||
${container.properties.type} ${buttonSelectedClass}`}
|
${container.properties.type} ${buttonClass}`}
|
||||||
id={key}
|
id={key}
|
||||||
key={key}
|
key={key}
|
||||||
style={style}
|
|
||||||
title={container.properties.warning}
|
title={container.properties.warning}
|
||||||
onClick={() => { selectContainer(container.properties.id); }}
|
onClick={() => { selectContainer(container.properties.id); }}
|
||||||
onDrop={(event) => {
|
onDrop={(event) => {
|
||||||
|
@ -253,5 +278,7 @@ function ElementsListRow(
|
||||||
{text}
|
{text}
|
||||||
{container.properties.warning.length > 0 &&
|
{container.properties.warning.length > 0 &&
|
||||||
<ExclamationTriangleIcon className='pl-2 w-7' />}
|
<ExclamationTriangleIcon className='pl-2 w-7' />}
|
||||||
</button>;
|
</button>
|
||||||
|
<hr className='border-t-2 h-[2px] border-t-slate-500'></hr>
|
||||||
|
</div>;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue