mepcli 1.3.2 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/dist/{ansi.js → src/ansi.js} +17 -9
- package/dist/src/ansi.js.map +1 -0
- package/dist/{base.js → src/base.js} +82 -70
- package/dist/src/base.js.map +1 -0
- package/dist/{core.js → src/core.js} +266 -320
- package/dist/src/core.js.map +1 -0
- package/dist/src/data/countries.js +569 -0
- package/dist/src/data/countries.js.map +1 -0
- package/dist/src/data/licenses.js +480 -0
- package/dist/src/data/licenses.js.map +1 -0
- package/dist/{highlight.js → src/highlight.js} +77 -69
- package/dist/src/highlight.js.map +1 -0
- package/dist/src/index.js +66 -0
- package/dist/src/index.js.map +1 -0
- package/dist/{input.js → src/input.js} +47 -41
- package/dist/src/input.js.map +1 -0
- package/dist/src/pipeline.js +273 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/{prompts → src/prompts}/autocomplete.js +58 -57
- package/dist/src/prompts/autocomplete.js.map +1 -0
- package/dist/{prompts → src/prompts}/box.js +86 -53
- package/dist/src/prompts/box.js.map +1 -0
- package/dist/{prompts → src/prompts}/breadcrumb-search.js +110 -98
- package/dist/src/prompts/breadcrumb-search.js.map +1 -0
- package/dist/{prompts → src/prompts}/breadcrumb.js +126 -121
- package/dist/src/prompts/breadcrumb.js.map +1 -0
- package/dist/{prompts → src/prompts}/byte.js +69 -52
- package/dist/src/prompts/byte.js.map +1 -0
- package/dist/{prompts → src/prompts}/calculator.js +79 -56
- package/dist/src/prompts/calculator.js.map +1 -0
- package/dist/{prompts → src/prompts}/calendar.js +167 -127
- package/dist/src/prompts/calendar.js.map +1 -0
- package/dist/{prompts → src/prompts}/checkbox.js +53 -49
- package/dist/src/prompts/checkbox.js.map +1 -0
- package/dist/{prompts → src/prompts}/code.js +88 -76
- package/dist/src/prompts/code.js.map +1 -0
- package/dist/{prompts → src/prompts}/color.js +68 -50
- package/dist/src/prompts/color.js.map +1 -0
- package/dist/{prompts → src/prompts}/confirm.js +22 -15
- package/dist/src/prompts/confirm.js.map +1 -0
- package/dist/{prompts → src/prompts}/connection-string.js +59 -36
- package/dist/src/prompts/connection-string.js.map +1 -0
- package/dist/{prompts → src/prompts}/cron.js +90 -59
- package/dist/src/prompts/cron.js.map +1 -0
- package/dist/src/prompts/curl-utils.js +71 -0
- package/dist/src/prompts/curl-utils.js.map +1 -0
- package/dist/{prompts → src/prompts}/curl.js +153 -132
- package/dist/src/prompts/curl.js.map +1 -0
- package/dist/{prompts → src/prompts}/data-inspector.js +96 -91
- package/dist/src/prompts/data-inspector.js.map +1 -0
- package/dist/{prompts → src/prompts}/date.js +64 -57
- package/dist/src/prompts/date.js.map +1 -0
- package/dist/{prompts → src/prompts}/dependency.js +84 -80
- package/dist/src/prompts/dependency.js.map +1 -0
- package/dist/{prompts → src/prompts}/dial.js +49 -35
- package/dist/src/prompts/dial.js.map +1 -0
- package/dist/src/prompts/diff.js +118 -0
- package/dist/src/prompts/diff.js.map +1 -0
- package/dist/{prompts → src/prompts}/draw.js +83 -80
- package/dist/src/prompts/draw.js.map +1 -0
- package/dist/src/prompts/editor.js +234 -0
- package/dist/src/prompts/editor.js.map +1 -0
- package/dist/{prompts → src/prompts}/emoji.js +80 -82
- package/dist/src/prompts/emoji.js.map +1 -0
- package/dist/{prompts → src/prompts}/exec.js +60 -46
- package/dist/src/prompts/exec.js.map +1 -0
- package/dist/src/prompts/file.js +217 -0
- package/dist/src/prompts/file.js.map +1 -0
- package/dist/{prompts → src/prompts}/form.js +63 -54
- package/dist/src/prompts/form.js.map +1 -0
- package/dist/{prompts → src/prompts}/fuzzy-multi-column.js +65 -53
- package/dist/src/prompts/fuzzy-multi-column.js.map +1 -0
- package/dist/{prompts → src/prompts}/fuzzy.js +66 -55
- package/dist/src/prompts/fuzzy.js.map +1 -0
- package/dist/src/prompts/gauge.js +137 -0
- package/dist/src/prompts/gauge.js.map +1 -0
- package/dist/{prompts → src/prompts}/grid.js +70 -57
- package/dist/src/prompts/grid.js.map +1 -0
- package/dist/{prompts → src/prompts}/heatmap.js +70 -64
- package/dist/src/prompts/heatmap.js.map +1 -0
- package/dist/{prompts → src/prompts}/ip.js +56 -36
- package/dist/src/prompts/ip.js.map +1 -0
- package/dist/{prompts → src/prompts}/kanban.js +63 -58
- package/dist/src/prompts/kanban.js.map +1 -0
- package/dist/src/prompts/keypress.js +54 -0
- package/dist/src/prompts/keypress.js.map +1 -0
- package/dist/src/prompts/license.js +144 -0
- package/dist/src/prompts/license.js.map +1 -0
- package/dist/{prompts → src/prompts}/list.js +46 -31
- package/dist/src/prompts/list.js.map +1 -0
- package/dist/{prompts → src/prompts}/map.js +93 -77
- package/dist/src/prompts/map.js.map +1 -0
- package/dist/{prompts → src/prompts}/match.js +91 -95
- package/dist/src/prompts/match.js.map +1 -0
- package/dist/{prompts → src/prompts}/miller.js +74 -67
- package/dist/src/prompts/miller.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-column-select.js +54 -44
- package/dist/src/prompts/multi-column-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-range.js +70 -52
- package/dist/src/prompts/multi-range.js.map +1 -0
- package/dist/{prompts → src/prompts}/multi-select.js +67 -58
- package/dist/src/prompts/multi-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/number.js +51 -39
- package/dist/src/prompts/number.js.map +1 -0
- package/dist/{prompts → src/prompts}/otp.js +43 -27
- package/dist/src/prompts/otp.js.map +1 -0
- package/dist/{prompts → src/prompts}/pattern.js +74 -71
- package/dist/src/prompts/pattern.js.map +1 -0
- package/dist/{prompts → src/prompts}/phone.js +107 -118
- package/dist/src/prompts/phone.js.map +1 -0
- package/dist/src/prompts/quiz-select.js +114 -0
- package/dist/src/prompts/quiz-select.js.map +1 -0
- package/dist/src/prompts/quiz-text.js +98 -0
- package/dist/src/prompts/quiz-text.js.map +1 -0
- package/dist/{prompts → src/prompts}/range.js +85 -61
- package/dist/src/prompts/range.js.map +1 -0
- package/dist/{prompts → src/prompts}/rating.js +29 -24
- package/dist/src/prompts/rating.js.map +1 -0
- package/dist/{prompts → src/prompts}/regex.js +50 -36
- package/dist/src/prompts/regex.js.map +1 -0
- package/dist/{prompts → src/prompts}/region.js +62 -56
- package/dist/src/prompts/region.js.map +1 -0
- package/dist/{prompts → src/prompts}/schedule.js +82 -75
- package/dist/src/prompts/schedule.js.map +1 -0
- package/dist/{prompts → src/prompts}/scroll.js +61 -58
- package/dist/src/prompts/scroll.js.map +1 -0
- package/dist/src/prompts/seat.js +164 -0
- package/dist/src/prompts/seat.js.map +1 -0
- package/dist/{prompts → src/prompts}/select-range.js +58 -46
- package/dist/src/prompts/select-range.js.map +1 -0
- package/dist/{prompts → src/prompts}/select.js +65 -66
- package/dist/src/prompts/select.js.map +1 -0
- package/dist/{prompts → src/prompts}/semver.js +24 -13
- package/dist/src/prompts/semver.js.map +1 -0
- package/dist/src/prompts/shortcut.js +133 -0
- package/dist/src/prompts/shortcut.js.map +1 -0
- package/dist/{prompts → src/prompts}/slider.js +28 -23
- package/dist/src/prompts/slider.js.map +1 -0
- package/dist/src/prompts/slot.js +117 -0
- package/dist/src/prompts/slot.js.map +1 -0
- package/dist/{prompts → src/prompts}/snippet.js +82 -61
- package/dist/src/prompts/snippet.js.map +1 -0
- package/dist/{prompts → src/prompts}/sort-grid.js +64 -59
- package/dist/src/prompts/sort-grid.js.map +1 -0
- package/dist/{prompts → src/prompts}/sort.js +59 -49
- package/dist/src/prompts/sort.js.map +1 -0
- package/dist/src/prompts/spam.js +80 -0
- package/dist/src/prompts/spam.js.map +1 -0
- package/dist/{prompts → src/prompts}/spreadsheet.js +71 -70
- package/dist/src/prompts/spreadsheet.js.map +1 -0
- package/dist/{prompts → src/prompts}/table.js +52 -38
- package/dist/src/prompts/table.js.map +1 -0
- package/dist/{prompts → src/prompts}/text.js +74 -70
- package/dist/src/prompts/text.js.map +1 -0
- package/dist/{prompts → src/prompts}/time.js +105 -96
- package/dist/src/prompts/time.js.map +1 -0
- package/dist/src/prompts/toggle.js +53 -0
- package/dist/src/prompts/toggle.js.map +1 -0
- package/dist/{prompts → src/prompts}/transfer.js +71 -67
- package/dist/src/prompts/transfer.js.map +1 -0
- package/dist/{prompts → src/prompts}/tree-select.js +83 -86
- package/dist/src/prompts/tree-select.js.map +1 -0
- package/dist/{prompts → src/prompts}/tree.js +69 -67
- package/dist/src/prompts/tree.js.map +1 -0
- package/dist/src/prompts/wait.js +79 -0
- package/dist/src/prompts/wait.js.map +1 -0
- package/dist/src/spinner.js +105 -0
- package/dist/src/spinner.js.map +1 -0
- package/dist/{symbols.js → src/symbols.js} +32 -7
- package/dist/src/symbols.js.map +1 -0
- package/dist/{tasks.js → src/tasks.js} +104 -79
- package/dist/src/tasks.js.map +1 -0
- package/dist/src/theme.js +29 -0
- package/dist/src/theme.js.map +1 -0
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -0
- package/dist/{utils.js → src/utils.js} +196 -152
- package/dist/src/utils.js.map +1 -0
- package/package.json +16 -13
- package/dist/ansi.d.ts +0 -36
- package/dist/base.d.ts +0 -60
- package/dist/core.d.ts +0 -1072
- package/dist/data/countries.d.ts +0 -2
- package/dist/data/countries.js +0 -105
- package/dist/data/licenses.d.ts +0 -2
- package/dist/data/licenses.js +0 -109
- package/dist/highlight.d.ts +0 -7
- package/dist/index.d.ts +0 -48
- package/dist/index.js +0 -64
- package/dist/input.d.ts +0 -14
- package/dist/pipeline.d.ts +0 -39
- package/dist/pipeline.js +0 -54
- package/dist/prompts/autocomplete.d.ts +0 -22
- package/dist/prompts/box.d.ts +0 -21
- package/dist/prompts/breadcrumb-search.d.ts +0 -14
- package/dist/prompts/breadcrumb.d.ts +0 -32
- package/dist/prompts/byte.d.ts +0 -13
- package/dist/prompts/calculator.d.ts +0 -17
- package/dist/prompts/calendar.d.ts +0 -33
- package/dist/prompts/checkbox.d.ts +0 -13
- package/dist/prompts/code.d.ts +0 -19
- package/dist/prompts/color.d.ts +0 -14
- package/dist/prompts/confirm.d.ts +0 -8
- package/dist/prompts/connection-string.d.ts +0 -18
- package/dist/prompts/cron.d.ts +0 -13
- package/dist/prompts/curl-utils.d.ts +0 -25
- package/dist/prompts/curl-utils.js +0 -41
- package/dist/prompts/curl.d.ts +0 -41
- package/dist/prompts/data-inspector.d.ts +0 -22
- package/dist/prompts/date.d.ts +0 -12
- package/dist/prompts/dependency.d.ts +0 -16
- package/dist/prompts/dial.d.ts +0 -10
- package/dist/prompts/diff.d.ts +0 -10
- package/dist/prompts/diff.js +0 -101
- package/dist/prompts/draw.d.ts +0 -20
- package/dist/prompts/editor.d.ts +0 -14
- package/dist/prompts/editor.js +0 -203
- package/dist/prompts/emoji.d.ts +0 -18
- package/dist/prompts/exec.d.ts +0 -17
- package/dist/prompts/file.d.ts +0 -21
- package/dist/prompts/file.js +0 -210
- package/dist/prompts/form.d.ts +0 -18
- package/dist/prompts/fuzzy-multi-column.d.ts +0 -12
- package/dist/prompts/fuzzy.d.ts +0 -12
- package/dist/prompts/gauge.d.ts +0 -21
- package/dist/prompts/gauge.js +0 -130
- package/dist/prompts/grid.d.ts +0 -14
- package/dist/prompts/heatmap.d.ts +0 -13
- package/dist/prompts/ip.d.ts +0 -11
- package/dist/prompts/kanban.d.ts +0 -17
- package/dist/prompts/keypress.d.ts +0 -7
- package/dist/prompts/keypress.js +0 -55
- package/dist/prompts/license.d.ts +0 -9
- package/dist/prompts/license.js +0 -105
- package/dist/prompts/list.d.ts +0 -9
- package/dist/prompts/map.d.ts +0 -17
- package/dist/prompts/match.d.ts +0 -19
- package/dist/prompts/miller.d.ts +0 -15
- package/dist/prompts/multi-column-select.d.ts +0 -10
- package/dist/prompts/multi-range.d.ts +0 -9
- package/dist/prompts/multi-select.d.ts +0 -15
- package/dist/prompts/number.d.ts +0 -11
- package/dist/prompts/otp.d.ts +0 -10
- package/dist/prompts/pattern.d.ts +0 -22
- package/dist/prompts/phone.d.ts +0 -41
- package/dist/prompts/quiz-select.d.ts +0 -10
- package/dist/prompts/quiz-select.js +0 -104
- package/dist/prompts/quiz-text.d.ts +0 -11
- package/dist/prompts/quiz-text.js +0 -82
- package/dist/prompts/range.d.ts +0 -9
- package/dist/prompts/rating.d.ts +0 -8
- package/dist/prompts/regex.d.ts +0 -13
- package/dist/prompts/region.d.ts +0 -11
- package/dist/prompts/schedule.d.ts +0 -20
- package/dist/prompts/scroll.d.ts +0 -13
- package/dist/prompts/seat.d.ts +0 -17
- package/dist/prompts/seat.js +0 -165
- package/dist/prompts/select-range.d.ts +0 -8
- package/dist/prompts/select.d.ts +0 -15
- package/dist/prompts/semver.d.ts +0 -6
- package/dist/prompts/shortcut.d.ts +0 -9
- package/dist/prompts/shortcut.js +0 -135
- package/dist/prompts/slider.d.ts +0 -8
- package/dist/prompts/slot.d.ts +0 -16
- package/dist/prompts/slot.js +0 -107
- package/dist/prompts/snippet.d.ts +0 -19
- package/dist/prompts/sort-grid.d.ts +0 -16
- package/dist/prompts/sort.d.ts +0 -14
- package/dist/prompts/spam.d.ts +0 -17
- package/dist/prompts/spam.js +0 -62
- package/dist/prompts/spreadsheet.d.ts +0 -21
- package/dist/prompts/table.d.ts +0 -14
- package/dist/prompts/text.d.ts +0 -17
- package/dist/prompts/time.d.ts +0 -12
- package/dist/prompts/toggle.d.ts +0 -8
- package/dist/prompts/toggle.js +0 -47
- package/dist/prompts/transfer.d.ts +0 -18
- package/dist/prompts/tree-select.d.ts +0 -31
- package/dist/prompts/tree.d.ts +0 -20
- package/dist/prompts/wait.d.ts +0 -18
- package/dist/prompts/wait.js +0 -62
- package/dist/spinner.d.ts +0 -33
- package/dist/spinner.js +0 -89
- package/dist/symbols.d.ts +0 -33
- package/dist/tasks.d.ts +0 -57
- package/dist/theme.d.ts +0 -2
- package/dist/theme.js +0 -20
- package/dist/types.d.ts +0 -503
- package/dist/types.js +0 -5
- package/dist/utils.d.ts +0 -81
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/miller.ts"],"sourcesContent":["import { Prompt } from '../base';\nimport { MillerOptions, TreeNode, MouseEvent } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { symbols } from '../symbols';\nimport { stringWidth, stripAnsi } from '../utils';\n\nexport class MillerPrompt<V> extends Prompt<V[], MillerOptions<V>> {\n private selections: number[] = [];\n private activeCol: number = 0;\n private scrollTops: number[] = []; // Scroll position for each column\n\n // Layout\n private colWidth: number = 0;\n private visibleCols: number = 3;\n\n constructor(options: MillerOptions<V>) {\n super(options);\n\n this.selections = [0];\n this.scrollTops = [0];\n\n // TODO: Map initial values to selections if provided\n\n this.calculateLayout();\n }\n\n private calculateLayout() {\n const termWidth = process.stdout.columns || 80;\n // We aim for 3 columns? Or based on width?\n // Minimum width per column ~ 20?\n this.visibleCols = Math.floor(termWidth / 20);\n if (this.visibleCols < 1) this.visibleCols = 1;\n if (this.visibleCols > 4) this.visibleCols = 4; // Cap at 4\n\n this.colWidth = Math.floor((termWidth - 4) / this.visibleCols); // -4 for margins\n }\n\n private getColumnData(depth: number): TreeNode<V>[] | undefined {\n let current = this.options.data;\n for (let i = 0; i < depth; i++) {\n const sel = this.selections[i];\n if (current[sel] && current[sel].children) {\n current = current[sel].children!;\n } else {\n return undefined;\n }\n }\n return current;\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n\n let startCol = 0;\n if (this.activeCol >= this.visibleCols) {\n startCol = this.activeCol - this.visibleCols + 1;\n }\n\n // Construct columns content\n const columnsToRender: string[][] = [];\n\n for (let c = startCol; c < startCol + this.visibleCols; c++) {\n const data = this.getColumnData(c);\n if (!data) break;\n\n const rows: string[] = [];\n const selectedIdx = this.selections[c] ?? -1;\n const isFocusedCol = c === this.activeCol;\n\n // Scroll handling\n const pageSize = 10; // Fixed height for now\n if (!this.scrollTops[c]) this.scrollTops[c] = 0;\n\n if (selectedIdx !== -1) {\n if (selectedIdx < this.scrollTops[c]) {\n this.scrollTops[c] = selectedIdx;\n } else if (selectedIdx >= this.scrollTops[c] + pageSize) {\n this.scrollTops[c] = selectedIdx - pageSize + 1;\n }\n }\n\n // Render rows\n const start = this.scrollTops[c];\n const end = Math.min(data.length, start + pageSize);\n\n for (let i = start; i < end; i++) {\n const item = data[i];\n const isSelected = i === selectedIdx;\n const isFocused = isSelected && isFocusedCol;\n\n let prefix = ' ';\n if (isSelected) {\n prefix = isFocused ? `${theme.main}${symbols.pointer}${ANSI.RESET}` : `${theme.muted}${symbols.pointer}${ANSI.RESET}`;\n }\n\n let title = item.title;\n // Truncate\n if (stringWidth(title) > this.colWidth - 4) {\n title = title.slice(0, this.colWidth - 5) + '…';\n }\n\n let line = `${prefix} ${isSelected && isFocused ? theme.main : ''}${title}${ANSI.RESET}`;\n\n // Add arrow if children exist\n if (item.children && item.children.length > 0) {\n const pad = this.colWidth - stringWidth(stripAnsi(line)) - 2;\n line += ' '.repeat(Math.max(0, pad)) + `${theme.muted}>${ANSI.RESET}`;\n }\n\n rows.push(line);\n }\n\n // Pad column to pageSize\n while (rows.length < pageSize) {\n rows.push('');\n }\n\n columnsToRender.push(rows);\n }\n\n // Combine columns side by side\n const rowCount = 10;\n for (let r = 0; r < rowCount; r++) {\n let line = '';\n for (let c = 0; c < columnsToRender.length; c++) {\n let cell = columnsToRender[c][r] || '';\n // Pad cell\n const len = stringWidth(stripAnsi(cell));\n const pad = this.colWidth - len;\n cell += ' '.repeat(Math.max(0, pad));\n\n line += cell;\n\n // Separator\n if (c < columnsToRender.length - 1) {\n line += `${theme.muted}│${ANSI.RESET} `;\n }\n }\n output += line + '\\n';\n }\n\n // Breadcrumbs / Status\n const pathTitles = [];\n for (let i = 0; i <= this.activeCol; i++) {\n const data = this.getColumnData(i);\n if (data && typeof this.selections[i] === 'number') {\n pathTitles.push(data[this.selections[i]].title);\n }\n }\n output += `${theme.muted}Path: ${pathTitles.join(' / ')}${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n const currentData = this.getColumnData(this.activeCol);\n if (!currentData) return; // Should not happen\n\n // Enter\n if (char === '\\r' || char === '\\n') {\n // Collect values\n const values: V[] = [];\n for (let i = 0; i <= this.activeCol; i++) {\n const d = this.getColumnData(i);\n if (d) values.push(d[this.selections[i]].value);\n }\n this.submit(values);\n return;\n }\n\n if (this.isUp(char)) {\n if (this.selections[this.activeCol] > 0) {\n this.selections[this.activeCol]--;\n // Reset subsequent columns\n this.selections = this.selections.slice(0, this.activeCol + 1);\n } else {\n this.selections[this.activeCol] = currentData.length - 1;\n this.selections = this.selections.slice(0, this.activeCol + 1);\n }\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n if (this.selections[this.activeCol] < currentData.length - 1) {\n this.selections[this.activeCol]++;\n this.selections = this.selections.slice(0, this.activeCol + 1);\n } else {\n this.selections[this.activeCol] = 0;\n this.selections = this.selections.slice(0, this.activeCol + 1);\n }\n this.render(false);\n return;\n }\n\n if (this.isRight(char) || char === '\\t') {\n // Expand\n const idx = this.selections[this.activeCol];\n const item = currentData[idx];\n if (item.children && item.children.length > 0) {\n this.activeCol++;\n this.selections[this.activeCol] = 0;\n this.render(false);\n }\n return;\n }\n\n if (this.isLeft(char) || char === '\\x1b[Z') {\n if (this.activeCol > 0) {\n this.activeCol--;\n this.render(false);\n }\n return;\n }\n }\n\n protected handleMouse(event: MouseEvent) {\n if (event.action === 'scroll') {\n const currentData = this.getColumnData(this.activeCol);\n if (!currentData || currentData.length === 0) return;\n\n if (event.scroll === 'up') {\n if (this.selections[this.activeCol] > 0) {\n this.selections[this.activeCol]--;\n } else {\n this.selections[this.activeCol] = currentData.length - 1;\n }\n } else if (event.scroll === 'down') {\n if (this.selections[this.activeCol] < currentData.length - 1) {\n this.selections[this.activeCol]++;\n } else {\n this.selections[this.activeCol] = 0;\n }\n }\n\n // Reset subsequent columns\n this.selections = this.selections.slice(0, this.activeCol + 1);\n this.render(false);\n }\n }\n}\n"],"names":["MillerPrompt","Prompt","calculateLayout","termWidth","process","stdout","columns","visibleCols","Math","floor","colWidth","getColumnData","depth","current","options","data","i","sel","selections","children","undefined","render","_firstRender","output","theme","success","ANSI","RESET","BOLD","title","message","startCol","activeCol","columnsToRender","c","rows","selectedIdx","isFocusedCol","pageSize","scrollTops","start","end","min","length","item","isSelected","isFocused","prefix","main","symbols","pointer","muted","stringWidth","slice","line","pad","stripAnsi","repeat","max","push","rowCount","r","cell","len","pathTitles","join","renderFrame","handleInput","char","currentData","values","d","value","submit","isUp","isDown","isRight","idx","isLeft","handleMouse","event","action","scroll"],"mappings":"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"}
|
|
@@ -1,21 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "MultiColumnSelectPrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return MultiColumnSelectPrompt;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _select = require("./select");
|
|
12
|
+
const _theme = require("../theme");
|
|
13
|
+
const _ansi = require("../ansi");
|
|
14
|
+
const _utils = require("../utils");
|
|
15
|
+
const _symbols = require("../symbols");
|
|
16
|
+
function _define_property(obj, key, value) {
|
|
17
|
+
if (key in obj) {
|
|
18
|
+
Object.defineProperty(obj, key, {
|
|
19
|
+
value: value,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
15
26
|
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
let MultiColumnSelectPrompt = class MultiColumnSelectPrompt extends _select.SelectPrompt {
|
|
16
30
|
calculateLayout() {
|
|
17
31
|
const termWidth = process.stdout.columns || 80;
|
|
18
|
-
const choices = this.options.choices.filter(c
|
|
32
|
+
const choices = this.options.choices.filter((c)=>!this.isSeparator(c));
|
|
19
33
|
if (choices.length === 0) {
|
|
20
34
|
this.cols = 1;
|
|
21
35
|
this.colWidth = termWidth;
|
|
@@ -23,21 +37,18 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
|
|
|
23
37
|
}
|
|
24
38
|
// Calculate max item width
|
|
25
39
|
let maxLen = 0;
|
|
26
|
-
for (const c of choices)
|
|
27
|
-
const len = (0,
|
|
28
|
-
if (len > maxLen)
|
|
29
|
-
maxLen = len;
|
|
40
|
+
for (const c of choices){
|
|
41
|
+
const len = (0, _utils.stringWidth)(c.title);
|
|
42
|
+
if (len > maxLen) maxLen = len;
|
|
30
43
|
}
|
|
31
44
|
// Add padding (pointer + space + item + space)
|
|
32
45
|
const itemWidth = maxLen + 4;
|
|
33
46
|
if (typeof this.options.cols === 'number') {
|
|
34
47
|
this.cols = this.options.cols;
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
48
|
+
} else {
|
|
37
49
|
// Auto
|
|
38
50
|
this.cols = Math.floor(termWidth / itemWidth);
|
|
39
|
-
if (this.cols < 1)
|
|
40
|
-
this.cols = 1;
|
|
51
|
+
if (this.cols < 1) this.cols = 1;
|
|
41
52
|
}
|
|
42
53
|
// Final column width
|
|
43
54
|
this.colWidth = Math.floor(termWidth / this.cols);
|
|
@@ -46,10 +57,10 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
|
|
|
46
57
|
let output = '';
|
|
47
58
|
const choices = this.getFilteredChoices();
|
|
48
59
|
// Header
|
|
49
|
-
const searchStr = this.searchBuffer ? ` ${
|
|
50
|
-
output += `${
|
|
60
|
+
const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
|
|
61
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
|
|
51
62
|
if (choices.length === 0) {
|
|
52
|
-
output += ` ${
|
|
63
|
+
output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
|
|
53
64
|
this.renderFrame(output);
|
|
54
65
|
return;
|
|
55
66
|
}
|
|
@@ -59,8 +70,7 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
|
|
|
59
70
|
const currentRow = Math.floor(this.selectedIndex / this.cols);
|
|
60
71
|
if (currentRow < this.scrollTop) {
|
|
61
72
|
this.scrollTop = currentRow;
|
|
62
|
-
}
|
|
63
|
-
else if (currentRow >= this.scrollTop + this.pageSize) {
|
|
73
|
+
} else if (currentRow >= this.scrollTop + this.pageSize) {
|
|
64
74
|
this.scrollTop = currentRow - this.pageSize + 1;
|
|
65
75
|
}
|
|
66
76
|
// Edge case: if list shrinks
|
|
@@ -69,27 +79,25 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
|
|
|
69
79
|
}
|
|
70
80
|
const startRow = this.scrollTop;
|
|
71
81
|
const endRow = Math.min(totalRows, startRow + this.pageSize);
|
|
72
|
-
for
|
|
82
|
+
for(let r = startRow; r < endRow; r++){
|
|
73
83
|
let rowStr = '';
|
|
74
|
-
for
|
|
84
|
+
for(let c = 0; c < this.cols; c++){
|
|
75
85
|
const idx = r * this.cols + c;
|
|
76
|
-
if (idx >= choices.length)
|
|
77
|
-
break;
|
|
86
|
+
if (idx >= choices.length) break;
|
|
78
87
|
const choice = choices[idx];
|
|
79
88
|
// Truncate if needed
|
|
80
89
|
let title = choice.title || '';
|
|
81
|
-
if ((0,
|
|
90
|
+
if ((0, _utils.stringWidth)(title) > this.colWidth - 3) {
|
|
82
91
|
title = title.slice(0, this.colWidth - 4) + '…';
|
|
83
92
|
}
|
|
84
93
|
let cellContent = '';
|
|
85
94
|
if (idx === this.selectedIndex) {
|
|
86
|
-
cellContent = `${
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
95
|
+
cellContent = `${_theme.theme.main}${_symbols.symbols.pointer} ${title}${_ansi.ANSI.RESET}`;
|
|
96
|
+
} else {
|
|
89
97
|
cellContent = ` ${title}`;
|
|
90
98
|
}
|
|
91
99
|
// Pad cell to colWidth
|
|
92
|
-
const currentWidth = (0,
|
|
100
|
+
const currentWidth = (0, _utils.stringWidth)(this.stripAnsi(cellContent));
|
|
93
101
|
const padding = Math.max(0, this.colWidth - currentWidth);
|
|
94
102
|
// Add cell to row
|
|
95
103
|
rowStr += cellContent + ' '.repeat(padding);
|
|
@@ -97,8 +105,7 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
|
|
|
97
105
|
output += rowStr + '\n';
|
|
98
106
|
}
|
|
99
107
|
// Remove trailing newline
|
|
100
|
-
if (output.endsWith('\n'))
|
|
101
|
-
output = output.slice(0, -1);
|
|
108
|
+
if (output.endsWith('\n')) output = output.slice(0, -1);
|
|
102
109
|
this.renderFrame(output);
|
|
103
110
|
}
|
|
104
111
|
handleInput(char) {
|
|
@@ -128,8 +135,7 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
|
|
|
128
135
|
if (this.isLeft(char)) {
|
|
129
136
|
if (this.selectedIndex > 0) {
|
|
130
137
|
this.selectedIndex--;
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
138
|
+
} else {
|
|
133
139
|
this.selectedIndex = choices.length - 1;
|
|
134
140
|
}
|
|
135
141
|
this.render(false);
|
|
@@ -138,8 +144,7 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
|
|
|
138
144
|
if (this.isRight(char)) {
|
|
139
145
|
if (this.selectedIndex < choices.length - 1) {
|
|
140
146
|
this.selectedIndex++;
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
147
|
+
} else {
|
|
143
148
|
this.selectedIndex = 0;
|
|
144
149
|
}
|
|
145
150
|
this.render(false);
|
|
@@ -162,5 +167,10 @@ class MultiColumnSelectPrompt extends select_1.SelectPrompt {
|
|
|
162
167
|
this.render(false);
|
|
163
168
|
}
|
|
164
169
|
}
|
|
165
|
-
|
|
166
|
-
|
|
170
|
+
constructor(options){
|
|
171
|
+
super(options), _define_property(this, "cols", 1), _define_property(this, "colWidth", 0);
|
|
172
|
+
this.calculateLayout();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
//# sourceMappingURL=multi-column-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/multi-column-select.ts"],"sourcesContent":["import { SelectPrompt } from './select';\nimport { MultiColumnSelectOptions, SelectChoice } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { stringWidth } from '../utils';\nimport { symbols } from '../symbols';\n\nexport class MultiColumnSelectPrompt<V> extends SelectPrompt<V, MultiColumnSelectOptions<V>> {\n protected cols: number = 1;\n protected colWidth: number = 0;\n\n constructor(options: MultiColumnSelectOptions<V>) {\n super(options);\n this.calculateLayout();\n }\n\n private calculateLayout() {\n const termWidth = process.stdout.columns || 80;\n const choices = this.options.choices.filter(c => !this.isSeparator(c)) as SelectChoice<V>[];\n\n if (choices.length === 0) {\n this.cols = 1;\n this.colWidth = termWidth;\n return;\n }\n\n // Calculate max item width\n let maxLen = 0;\n for (const c of choices) {\n const len = stringWidth(c.title);\n if (len > maxLen) maxLen = len;\n }\n\n // Add padding (pointer + space + item + space)\n const itemWidth = maxLen + 4;\n\n if (typeof this.options.cols === 'number') {\n this.cols = this.options.cols;\n } else {\n // Auto\n this.cols = Math.floor(termWidth / itemWidth);\n if (this.cols < 1) this.cols = 1;\n }\n\n // Final column width\n this.colWidth = Math.floor(termWidth / this.cols);\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n this.renderFrame(output);\n return;\n }\n\n // Grid Render\n const totalRows = Math.ceil(choices.length / this.cols);\n\n // Adjust Scroll\n const currentRow = Math.floor(this.selectedIndex / this.cols);\n if (currentRow < this.scrollTop) {\n this.scrollTop = currentRow;\n } else if (currentRow >= this.scrollTop + this.pageSize) {\n this.scrollTop = currentRow - this.pageSize + 1;\n }\n\n // Edge case: if list shrinks\n if (this.scrollTop > totalRows - 1) {\n this.scrollTop = Math.max(0, totalRows - this.pageSize);\n }\n\n const startRow = this.scrollTop;\n const endRow = Math.min(totalRows, startRow + this.pageSize);\n\n for (let r = startRow; r < endRow; r++) {\n let rowStr = '';\n for (let c = 0; c < this.cols; c++) {\n const idx = r * this.cols + c;\n if (idx >= choices.length) break;\n\n const choice = choices[idx];\n\n // Truncate if needed\n let title = (choice as any).title || '';\n if (stringWidth(title) > this.colWidth - 3) {\n title = title.slice(0, this.colWidth - 4) + '…';\n }\n\n let cellContent = '';\n if (idx === this.selectedIndex) {\n cellContent = `${theme.main}${symbols.pointer} ${title}${ANSI.RESET}`;\n } else {\n cellContent = ` ${title}`;\n }\n\n // Pad cell to colWidth\n const currentWidth = stringWidth(this.stripAnsi(cellContent));\n const padding = Math.max(0, this.colWidth - currentWidth);\n\n // Add cell to row\n rowStr += cellContent + ' '.repeat(padding);\n }\n output += rowStr + '\\n';\n }\n\n // Remove trailing newline\n if (output.endsWith('\\n')) output = output.slice(0, -1);\n\n this.renderFrame(output);\n }\n\n protected handleInput(char: string) {\n const choices = this.getFilteredChoices();\n\n if (char === '\\r' || char === '\\n') {\n if (choices.length > 0) {\n this.submit((choices[this.selectedIndex] as any).value);\n }\n return;\n }\n\n if (this.isUp(char)) {\n const newIndex = this.selectedIndex - this.cols;\n if (newIndex >= 0) {\n this.selectedIndex = newIndex;\n }\n this.render(false);\n return;\n }\n\n if (this.isDown(char)) {\n const newIndex = this.selectedIndex + this.cols;\n if (newIndex < choices.length) {\n this.selectedIndex = newIndex;\n }\n this.render(false);\n return;\n }\n\n if (this.isLeft(char)) {\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = choices.length - 1;\n }\n this.render(false);\n return;\n }\n\n if (this.isRight(char)) {\n if (this.selectedIndex < choices.length - 1) {\n this.selectedIndex++;\n } else {\n this.selectedIndex = 0;\n }\n this.render(false);\n return;\n }\n\n // Backspace\n if (char === '\\u0008' || char === '\\x7f') {\n if (this.searchBuffer.length > 0) {\n this.searchBuffer = this.searchBuffer.slice(0, -1);\n this.selectedIndex = 0;\n this.calculateLayout();\n this.render(false);\n }\n return;\n }\n\n // Typing\n if (char.length === 1 && !/^[\\x00-\\x1F]/.test(char) && !char.startsWith('\\x1b')) {\n this.searchBuffer += char;\n this.selectedIndex = 0;\n this.render(false);\n }\n }\n}\n\n"],"names":["MultiColumnSelectPrompt","SelectPrompt","calculateLayout","termWidth","process","stdout","columns","choices","options","filter","c","isSeparator","length","cols","colWidth","maxLen","len","stringWidth","title","itemWidth","Math","floor","render","_firstRender","output","getFilteredChoices","searchStr","searchBuffer","theme","muted","ANSI","RESET","success","BOLD","message","renderFrame","totalRows","ceil","currentRow","selectedIndex","scrollTop","pageSize","max","startRow","endRow","min","r","rowStr","idx","choice","slice","cellContent","main","symbols","pointer","currentWidth","stripAnsi","padding","repeat","endsWith","handleInput","char","submit","value","isUp","newIndex","isDown","isLeft","isRight","test","startsWith"],"mappings":"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"}
|
|
@@ -1,28 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
constructor(options) {
|
|
10
|
-
super(options);
|
|
11
|
-
this.committedRanges = [];
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "MultiRangePrompt", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return MultiRangePrompt;
|
|
12
9
|
}
|
|
10
|
+
});
|
|
11
|
+
const _selectrange = require("./select-range");
|
|
12
|
+
const _theme = require("../theme");
|
|
13
|
+
const _ansi = require("../ansi");
|
|
14
|
+
const _symbols = require("../symbols");
|
|
15
|
+
function _define_property(obj, key, value) {
|
|
16
|
+
if (key in obj) {
|
|
17
|
+
Object.defineProperty(obj, key, {
|
|
18
|
+
value: value,
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true
|
|
22
|
+
});
|
|
23
|
+
} else {
|
|
24
|
+
obj[key] = value;
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
let MultiRangePrompt = class MultiRangePrompt extends _selectrange.SelectRangePrompt {
|
|
13
29
|
mergeRanges() {
|
|
14
|
-
if (this.committedRanges.length === 0)
|
|
15
|
-
return;
|
|
30
|
+
if (this.committedRanges.length === 0) return;
|
|
16
31
|
// Sort by start index
|
|
17
|
-
this.committedRanges.sort((a, b)
|
|
32
|
+
this.committedRanges.sort((a, b)=>a.start - b.start);
|
|
18
33
|
const merged = [];
|
|
19
34
|
let current = this.committedRanges[0];
|
|
20
|
-
for
|
|
35
|
+
for(let i = 1; i < this.committedRanges.length; i++){
|
|
21
36
|
const next = this.committedRanges[i];
|
|
22
|
-
if (current.end >= next.start - 1) {
|
|
37
|
+
if (current.end >= next.start - 1) {
|
|
23
38
|
current.end = Math.max(current.end, next.end);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
39
|
+
} else {
|
|
26
40
|
merged.push(current);
|
|
27
41
|
current = next;
|
|
28
42
|
}
|
|
@@ -34,20 +48,22 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
|
|
|
34
48
|
// Handle Enter (Submit)
|
|
35
49
|
if (char === '\r' || char === '\n') {
|
|
36
50
|
const choices = this.getFilteredChoices();
|
|
37
|
-
if (choices.length === 0)
|
|
38
|
-
return;
|
|
51
|
+
if (choices.length === 0) return;
|
|
39
52
|
// If user was dragging, commit that range first
|
|
40
53
|
if (this.anchorIndex !== null) {
|
|
41
54
|
const start = Math.min(this.anchorIndex, this.selectedIndex);
|
|
42
55
|
const end = Math.max(this.anchorIndex, this.selectedIndex);
|
|
43
|
-
this.committedRanges.push({
|
|
56
|
+
this.committedRanges.push({
|
|
57
|
+
start,
|
|
58
|
+
end
|
|
59
|
+
});
|
|
44
60
|
this.mergeRanges();
|
|
45
61
|
this.anchorIndex = null;
|
|
46
62
|
}
|
|
47
63
|
// Collect all indices from committed ranges
|
|
48
64
|
const allIndices = new Set();
|
|
49
|
-
for (const range of this.committedRanges)
|
|
50
|
-
for
|
|
65
|
+
for (const range of this.committedRanges){
|
|
66
|
+
for(let i = range.start; i <= range.end; i++){
|
|
51
67
|
allIndices.add(i);
|
|
52
68
|
}
|
|
53
69
|
}
|
|
@@ -55,8 +71,8 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
|
|
|
55
71
|
allIndices.add(this.selectedIndex);
|
|
56
72
|
}
|
|
57
73
|
const selectedItems = [];
|
|
58
|
-
const sortedIndices = Array.from(allIndices).sort((a, b)
|
|
59
|
-
for (const idx of sortedIndices)
|
|
74
|
+
const sortedIndices = Array.from(allIndices).sort((a, b)=>a - b);
|
|
75
|
+
for (const idx of sortedIndices){
|
|
60
76
|
if (idx < choices.length) {
|
|
61
77
|
const choice = choices[idx];
|
|
62
78
|
if (!this.isSeparator(choice)) {
|
|
@@ -72,12 +88,14 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
|
|
|
72
88
|
if (this.anchorIndex === null) {
|
|
73
89
|
// Start dragging
|
|
74
90
|
this.anchorIndex = this.selectedIndex;
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
91
|
+
} else {
|
|
77
92
|
// Commit range
|
|
78
93
|
const start = Math.min(this.anchorIndex, this.selectedIndex);
|
|
79
94
|
const end = Math.max(this.anchorIndex, this.selectedIndex);
|
|
80
|
-
this.committedRanges.push({
|
|
95
|
+
this.committedRanges.push({
|
|
96
|
+
start,
|
|
97
|
+
end
|
|
98
|
+
});
|
|
81
99
|
this.mergeRanges();
|
|
82
100
|
this.anchorIndex = null;
|
|
83
101
|
}
|
|
@@ -92,27 +110,24 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
|
|
|
92
110
|
// Scroll Logic (inherited from SelectPrompt basically, but good to ensure)
|
|
93
111
|
if (this.selectedIndex < this.scrollTop) {
|
|
94
112
|
this.scrollTop = this.selectedIndex;
|
|
95
|
-
}
|
|
96
|
-
else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
113
|
+
} else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
97
114
|
this.scrollTop = this.selectedIndex - this.pageSize + 1;
|
|
98
115
|
}
|
|
99
116
|
if (this.scrollTop > choices.length - 1) {
|
|
100
117
|
this.scrollTop = Math.max(0, choices.length - this.pageSize);
|
|
101
118
|
}
|
|
102
119
|
// Header
|
|
103
|
-
const searchStr = this.searchBuffer ? ` ${
|
|
104
|
-
output += `${
|
|
120
|
+
const searchStr = this.searchBuffer ? ` ${_theme.theme.muted}(Filter: ${this.searchBuffer})${_ansi.ANSI.RESET}` : '';
|
|
121
|
+
output += `${_theme.theme.success}?${_ansi.ANSI.RESET} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}${searchStr}\n`;
|
|
105
122
|
if (choices.length === 0) {
|
|
106
|
-
output += ` ${
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
123
|
+
output += ` ${_theme.theme.muted}No results found${_ansi.ANSI.RESET}`;
|
|
124
|
+
} else {
|
|
109
125
|
const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
|
|
110
|
-
visibleChoices.forEach((choice, index)
|
|
126
|
+
visibleChoices.forEach((choice, index)=>{
|
|
111
127
|
const actualIndex = this.scrollTop + index;
|
|
112
|
-
if (index > 0)
|
|
113
|
-
output += '\n';
|
|
128
|
+
if (index > 0) output += '\n';
|
|
114
129
|
let isCommitted = false;
|
|
115
|
-
for (const range of this.committedRanges)
|
|
130
|
+
for (const range of this.committedRanges){
|
|
116
131
|
if (actualIndex >= range.start && actualIndex <= range.end) {
|
|
117
132
|
isCommitted = true;
|
|
118
133
|
break;
|
|
@@ -127,45 +142,48 @@ class MultiRangePrompt extends select_range_1.SelectRangePrompt {
|
|
|
127
142
|
}
|
|
128
143
|
}
|
|
129
144
|
if (this.isSeparator(choice)) {
|
|
130
|
-
output += ` ${
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
145
|
+
output += ` ${_ansi.ANSI.DIM}${choice.text || _symbols.symbols.line.repeat(8)}${_ansi.ANSI.RESET}`;
|
|
146
|
+
} else {
|
|
133
147
|
let prefix = ' ';
|
|
134
148
|
const title = choice.title;
|
|
135
149
|
let content = title;
|
|
136
150
|
// Markers
|
|
137
151
|
if (actualIndex === this.anchorIndex) {
|
|
138
|
-
prefix = `${
|
|
152
|
+
prefix = `${_theme.theme.muted}> ${_ansi.ANSI.RESET}`;
|
|
139
153
|
}
|
|
140
154
|
if (actualIndex === this.selectedIndex) {
|
|
141
|
-
prefix = `${
|
|
155
|
+
prefix = `${_theme.theme.main}${_symbols.symbols.pointer} `;
|
|
142
156
|
}
|
|
143
157
|
if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {
|
|
144
|
-
prefix = `${
|
|
158
|
+
prefix = `${_theme.theme.main}${_symbols.symbols.pointer}>`;
|
|
145
159
|
}
|
|
146
160
|
// Highlighting
|
|
147
161
|
if (isCommitted || isDragging) {
|
|
148
162
|
// Apply highlighting style
|
|
149
163
|
// If committed, maybe green? If dragging, maybe yellow or just highlighted?
|
|
150
164
|
if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {
|
|
151
|
-
prefix = `${
|
|
165
|
+
prefix = `${_theme.theme.success}* ${_ansi.ANSI.RESET}`;
|
|
152
166
|
}
|
|
153
|
-
content = `${
|
|
167
|
+
content = `${_theme.theme.success}${title}${_ansi.ANSI.RESET}`;
|
|
154
168
|
if (isDragging && !isCommitted) {
|
|
155
|
-
|
|
156
|
-
|
|
169
|
+
// Distinguish dragging visual? Maybe dim?
|
|
170
|
+
// Using same style as single range prompt for consistency
|
|
157
171
|
}
|
|
158
172
|
}
|
|
159
173
|
// Cursor Underline
|
|
160
174
|
if (actualIndex === this.selectedIndex) {
|
|
161
|
-
content = `${
|
|
175
|
+
content = `${_ansi.ANSI.UNDERLINE}${content}${_ansi.ANSI.RESET}`;
|
|
162
176
|
}
|
|
163
177
|
output += `${prefix}${content}`;
|
|
164
178
|
}
|
|
165
179
|
});
|
|
166
180
|
}
|
|
167
|
-
output += `\n${
|
|
181
|
+
output += `\n${_theme.theme.muted}(Space to anchor/commit, Enter to submit)${_ansi.ANSI.RESET}`;
|
|
168
182
|
this.renderFrame(output);
|
|
169
183
|
}
|
|
170
|
-
|
|
171
|
-
|
|
184
|
+
constructor(options){
|
|
185
|
+
super(options), _define_property(this, "committedRanges", []);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
//# sourceMappingURL=multi-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/prompts/multi-range.ts"],"sourcesContent":["import { SelectRangePrompt } from './select-range';\nimport { SelectRangeOptions } from '../types';\nimport { theme } from '../theme';\nimport { ANSI } from '../ansi';\nimport { symbols } from '../symbols';\n\nexport class MultiRangePrompt<V> extends SelectRangePrompt<V> {\n private committedRanges: { start: number; end: number }[] = [];\n\n constructor(options: SelectRangeOptions<V>) {\n super(options);\n }\n\n private mergeRanges() {\n if (this.committedRanges.length === 0) return;\n\n // Sort by start index\n this.committedRanges.sort((a, b) => a.start - b.start);\n\n const merged: { start: number; end: number }[] = [];\n let current = this.committedRanges[0];\n\n for (let i = 1; i < this.committedRanges.length; i++) {\n const next = this.committedRanges[i];\n\n if (current.end >= next.start - 1) { // Overlap or adjacent\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n merged.push(current);\n this.committedRanges = merged;\n }\n\n protected handleInput(char: string, key?: Buffer) {\n // Handle Enter (Submit)\n if (char === '\\r' || char === '\\n') {\n const choices = this.getFilteredChoices();\n if (choices.length === 0) return;\n\n // If user was dragging, commit that range first\n if (this.anchorIndex !== null) {\n const start = Math.min(this.anchorIndex, this.selectedIndex);\n const end = Math.max(this.anchorIndex, this.selectedIndex);\n this.committedRanges.push({ start, end });\n this.mergeRanges();\n this.anchorIndex = null;\n }\n\n // Collect all indices from committed ranges\n const allIndices = new Set<number>();\n for (const range of this.committedRanges) {\n for (let i = range.start; i <= range.end; i++) {\n allIndices.add(i);\n }\n }\n\n if (allIndices.size === 0) {\n allIndices.add(this.selectedIndex);\n }\n\n const selectedItems: V[] = [];\n const sortedIndices = Array.from(allIndices).sort((a, b) => a - b);\n\n for (const idx of sortedIndices) {\n if (idx < choices.length) {\n const choice = choices[idx];\n if (!this.isSeparator(choice)) {\n selectedItems.push((choice as any).value);\n }\n }\n }\n\n this.submit(selectedItems as any);\n return;\n }\n\n // Handle Space (Anchor/Commit)\n if (char === ' ') {\n if (this.anchorIndex === null) {\n // Start dragging\n this.anchorIndex = this.selectedIndex;\n } else {\n // Commit range\n const start = Math.min(this.anchorIndex, this.selectedIndex);\n const end = Math.max(this.anchorIndex, this.selectedIndex);\n\n this.committedRanges.push({ start, end });\n this.mergeRanges();\n\n this.anchorIndex = null;\n }\n this.render(false);\n return;\n }\n super.handleInput(char, key);\n }\n\n protected render(_firstRender: boolean) {\n let output = '';\n const choices = this.getFilteredChoices();\n\n // Scroll Logic (inherited from SelectPrompt basically, but good to ensure)\n if (this.selectedIndex < this.scrollTop) {\n this.scrollTop = this.selectedIndex;\n } else if (this.selectedIndex >= this.scrollTop + this.pageSize) {\n this.scrollTop = this.selectedIndex - this.pageSize + 1;\n }\n if (this.scrollTop > choices.length - 1) {\n this.scrollTop = Math.max(0, choices.length - this.pageSize);\n }\n\n // Header\n const searchStr = this.searchBuffer ? ` ${theme.muted}(Filter: ${this.searchBuffer})${ANSI.RESET}` : '';\n output += `${theme.success}?${ANSI.RESET} ${ANSI.BOLD}${theme.title}${this.options.message}${ANSI.RESET}${searchStr}\\n`;\n\n if (choices.length === 0) {\n output += ` ${theme.muted}No results found${ANSI.RESET}`;\n } else {\n const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);\n\n visibleChoices.forEach((choice, index) => {\n const actualIndex = this.scrollTop + index;\n if (index > 0) output += '\\n';\n\n let isCommitted = false;\n for (const range of this.committedRanges) {\n if (actualIndex >= range.start && actualIndex <= range.end) {\n isCommitted = true;\n break;\n }\n }\n\n let isDragging = false;\n if (this.anchorIndex !== null) {\n const min = Math.min(this.anchorIndex, this.selectedIndex);\n const max = Math.max(this.anchorIndex, this.selectedIndex);\n if (actualIndex >= min && actualIndex <= max) {\n isDragging = true;\n }\n }\n\n if (this.isSeparator(choice)) {\n output += ` ${ANSI.DIM}${(choice as any).text || symbols.line.repeat(8)}${ANSI.RESET}`;\n } else {\n let prefix = ' ';\n const title = (choice as any).title;\n let content = title;\n\n // Markers\n if (actualIndex === this.anchorIndex) {\n prefix = `${theme.muted}> ${ANSI.RESET}`;\n }\n if (actualIndex === this.selectedIndex) {\n prefix = `${theme.main}${symbols.pointer} `;\n }\n if (actualIndex === this.selectedIndex && actualIndex === this.anchorIndex) {\n prefix = `${theme.main}${symbols.pointer}>`;\n }\n\n // Highlighting\n if (isCommitted || isDragging) {\n // Apply highlighting style\n // If committed, maybe green? If dragging, maybe yellow or just highlighted?\n\n if (actualIndex !== this.selectedIndex && actualIndex !== this.anchorIndex) {\n prefix = `${theme.success}* ${ANSI.RESET}`;\n }\n\n content = `${theme.success}${title}${ANSI.RESET}`;\n\n if (isDragging && !isCommitted) {\n // Distinguish dragging visual? Maybe dim? \n // Using same style as single range prompt for consistency\n }\n }\n\n // Cursor Underline\n if (actualIndex === this.selectedIndex) {\n content = `${ANSI.UNDERLINE}${content}${ANSI.RESET}`;\n }\n\n output += `${prefix}${content}`;\n }\n });\n }\n\n output += `\\n${theme.muted}(Space to anchor/commit, Enter to submit)${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n}\n"],"names":["MultiRangePrompt","SelectRangePrompt","mergeRanges","committedRanges","length","sort","a","b","start","merged","current","i","next","end","Math","max","push","handleInput","char","key","choices","getFilteredChoices","anchorIndex","min","selectedIndex","allIndices","Set","range","add","size","selectedItems","sortedIndices","Array","from","idx","choice","isSeparator","value","submit","render","_firstRender","output","scrollTop","pageSize","searchStr","searchBuffer","theme","muted","ANSI","RESET","success","BOLD","title","options","message","visibleChoices","slice","forEach","index","actualIndex","isCommitted","isDragging","DIM","text","symbols","line","repeat","prefix","content","main","pointer","UNDERLINE","renderFrame"],"mappings":"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"}
|