@farjs/ui
Version:
Terminal UI React.js components library
100 lines (88 loc) • 2.42 kB
JavaScript
/**
* @typedef {import("./ListViewport.mjs").ListViewport} ListViewport
*/
import React from "react";
import SingleBorder from "./border/SingleBorder.mjs";
import ListView from "./ListView.mjs";
import ScrollBar from "./ScrollBar.mjs";
const h = React.createElement;
/**
* @typedef {{
* readonly left: number;
* readonly top: number;
* readonly width: number;
* readonly items: readonly string[];
* readonly style: import("@farjs/blessed").Widgets.Types.TStyle;
* readonly viewport: ListViewport;
* setViewport(viewport: ListViewport): void;
* onClick(index: number): void;
* }} ComboBoxPopupProps
*/
/**
* @param {ComboBoxPopupProps} props
*/
const ComboBoxPopup = (props) => {
const { singleBorderComp, listViewComp, scrollBarComp } = ComboBoxPopup;
const width = props.width;
const height = ComboBoxPopup.maxItems + 2;
const viewWidth = width - 2;
const theme = props.style;
const viewport = props.viewport;
return h(
"box",
{
clickable: true,
autoFocus: false,
width: width,
height: height,
left: props.left,
top: props.top,
onWheelup: () => {
props.setViewport(viewport.up());
},
onWheeldown: () => {
props.setViewport(viewport.down());
},
style: theme,
},
h(singleBorderComp, {
width: width,
height: height,
style: theme,
}),
h(listViewComp, {
left: 1,
top: 1,
width: viewWidth,
height: height - 2,
items: props.items.map(
(i) => ` ${i.slice(0, Math.min(viewWidth - 4, i.length))} `
),
viewport: viewport,
setViewport: props.setViewport,
style: theme,
onClick: props.onClick,
}),
viewport.length > viewport.viewLength
? h(scrollBarComp, {
left: width - 1,
top: 1,
length: viewport.viewLength,
style: theme,
value: viewport.offset,
extent: viewport.viewLength,
min: 0,
max: viewport.length - viewport.viewLength,
onChange: (offset) => {
props.setViewport(viewport.updated(offset));
},
})
: null
);
};
ComboBoxPopup.displayName = "ComboBoxPopup";
ComboBoxPopup.singleBorderComp = SingleBorder;
ComboBoxPopup.listViewComp = ListView;
ComboBoxPopup.scrollBarComp = ScrollBar;
ComboBoxPopup.maxItems = 8;
export default ComboBoxPopup;