esa-cli
Version:
A CLI for operating Alibaba Cloud ESA Functions and Pages.
96 lines (95 loc) • 4.34 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { Box, render, Text, useInput } from 'ink';
import React, { useState } from 'react';
import t from '../i18n/index.js';
export const MultiSelectTable = ({ items, itemsPerRow, onSubmit, boxWidth = 25 }) => {
const [selectedIndexes, setSelectedIndexes] = useState(new Set());
const [cursorRow, setCursorRow] = useState(0);
const [cursorCol, setCursorCol] = useState(0);
const rows = [];
for (let i = 0; i < items.length; i += itemsPerRow) {
rows.push(items.slice(i, i + itemsPerRow));
}
const totalRows = Math.ceil(items.length / itemsPerRow);
const toggleSelect = (row, col) => {
const key = `${row}:${col}`;
setSelectedIndexes((prevSelectedIndexes) => {
const newSelectedIndexes = new Set(prevSelectedIndexes);
if (newSelectedIndexes.has(key)) {
newSelectedIndexes.delete(key);
}
else {
newSelectedIndexes.add(key);
}
return newSelectedIndexes;
});
};
const handleSubmission = () => {
const selectedItems = Array.from(selectedIndexes).map((key) => {
const [row, col] = key.split(':').map(Number);
return rows[row][col];
});
onSubmit(selectedItems);
};
useInput((input, key) => {
if (key.leftArrow) {
setCursorCol((prev) => Math.max(prev - 1, 0));
}
else if (key.rightArrow) {
setCursorCol((prev) => Math.min(prev + 1, itemsPerRow - 1));
}
else if (key.upArrow) {
setCursorRow((prev) => Math.max(prev - 1, 0));
}
else if (key.downArrow) {
setCursorRow((prev) => Math.min(prev + 1, totalRows - 1));
}
else if (input === ' ') {
toggleSelect(cursorRow, cursorCol);
}
else if (key.tab) {
setCursorCol((prevCol) => {
let newCol = prevCol + 1;
let newRow = cursorRow;
if (newCol >= itemsPerRow) {
newCol = 0;
newRow = cursorRow + 1;
if (newRow >= totalRows) {
newRow = 0;
}
setCursorRow(newRow);
}
return newCol;
});
}
else if (key.return) {
handleSubmission();
}
});
return (React.createElement(Box, { flexDirection: "column" },
rows.map((rowItems, row) => (React.createElement(Box, { key: row, flexDirection: "row" }, rowItems.map((item, col) => (React.createElement(Box, { key: `${row}:${col}`, width: boxWidth },
React.createElement(Text, { color: cursorRow === row && cursorCol === col ? 'green' : undefined },
selectedIndexes.has(`${row}:${col}`) ? '✅' : ' ',
item.label))))))),
React.createElement(Box, { flexDirection: "column" },
React.createElement(Text, null,
"\uD83D\uDD14",
' ',
t('deploy_select_table_tip').d('Use arrow keys to move, space to select, and enter to submit.')))));
};
export const displayMultiSelectTable = (items_1, ...args_1) => __awaiter(void 0, [items_1, ...args_1], void 0, function* (items, itemsPerRow = 7, boxWidth = 25) {
return new Promise((resolve) => {
const { unmount } = render(React.createElement(MultiSelectTable, { items: items, itemsPerRow: itemsPerRow, onSubmit: (selectedItems) => {
unmount();
resolve(selectedItems.map((item) => item.label));
}, boxWidth: boxWidth }));
});
});