(props: {
theme: Accessor<RunFooterTheme>
items: Accessor<RunFooterMenuItem[]>
selected: Accessor<number>
offset: Accessor<number>
rows: Accessor<number>
limit?: number
empty?: string
border?: boolean
paddingLeft?: number
paddingRight?: number
grouped?: boolean
background?: boolean
headerColor?: ColorInput
})
| 115 | } |
| 116 | |
| 117 | export function RunFooterMenu(props: { |
| 118 | theme: Accessor<RunFooterTheme> |
| 119 | items: Accessor<RunFooterMenuItem[]> |
| 120 | selected: Accessor<number> |
| 121 | offset: Accessor<number> |
| 122 | rows: Accessor<number> |
| 123 | limit?: number |
| 124 | empty?: string |
| 125 | border?: boolean |
| 126 | paddingLeft?: number |
| 127 | paddingRight?: number |
| 128 | grouped?: boolean |
| 129 | background?: boolean |
| 130 | headerColor?: ColorInput |
| 131 | }) { |
| 132 | const term = useTerminalDimensions() |
| 133 | const limit = () => props.limit ?? FOOTER_MENU_ROWS |
| 134 | const border = () => props.border ?? true |
| 135 | const [groupOffset, setGroupOffset] = createSignal(0) |
| 136 | let previous = -1 |
| 137 | const groupedRows = createMemo<RunFooterMenuRow[]>(() => { |
| 138 | const all: RunFooterMenuRow[] = [] |
| 139 | let category = "" |
| 140 | props.items().forEach((item, index) => { |
| 141 | if (item.category && item.category !== category) { |
| 142 | if (all.length > 0) { |
| 143 | all.push({ type: "spacer" }) |
| 144 | } |
| 145 | |
| 146 | category = item.category |
| 147 | all.push({ type: "header", label: item.category }) |
| 148 | } |
| 149 | |
| 150 | all.push({ type: "item", item, index }) |
| 151 | }) |
| 152 | return all |
| 153 | }) |
| 154 | |
| 155 | createEffect(() => { |
| 156 | if (!props.grouped) { |
| 157 | return |
| 158 | } |
| 159 | |
| 160 | const all = groupedRows() |
| 161 | const selected = all.findIndex((item) => item.type === "item" && item.index === props.selected()) |
| 162 | if (all.length === 0 || selected === -1) { |
| 163 | setGroupOffset(0) |
| 164 | previous = props.selected() |
| 165 | return |
| 166 | } |
| 167 | |
| 168 | const dir = props.selected() === previous + 1 ? 1 : props.selected() === previous - 1 ? -1 : undefined |
| 169 | setGroupOffset((value) => |
| 170 | dir |
| 171 | ? moveOffset(value, { count: all.length, limit: limit(), selected, dir }) |
| 172 | : revealOffset(value, { count: all.length, limit: limit(), selected }), |
| 173 | ) |
| 174 | previous = props.selected() |
nothing calls this directly
no test coverage detected