chore: Revert container command input style (#11387)

revert for #10724

https://bbs.fit2cloud.com/t/topic/16496
This commit is contained in:
ssongliu 2025-12-18 16:59:14 +08:00 committed by GitHub
parent 825acd5b46
commit a91f372fbd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 87 additions and 24 deletions

View file

@ -70,6 +70,8 @@ export namespace Container {
hostname: string;
domainName: string;
dns: Array<string>;
cmdStr: string;
entrypointStr: string;
memoryItem: number;
cmd: Array<string>;
workingDir: string;

View file

@ -906,7 +906,8 @@ const message = {
containerExample: '80 or 80-88',
exposePort: 'Expose port',
exposeAll: 'Expose all',
cmdHelper: 'Enter a command and press Enter to continue inputting. Commands can be dragged to reorder.',
cmdHelper: 'Example: nginx -g "daemon off;"',
entrypointHelper: 'Example: docker-entrypoint.sh',
autoRemove: 'Auto remove',
cpuQuota: 'Number of CPU cores',
memoryLimit: 'Memory',

View file

@ -913,8 +913,8 @@ const message = {
containerExample: '80 o 80-88',
exposePort: 'Exponer puerto',
exposeAll: 'Exponer todos',
cmdHelper:
'Ingrese un comando y presione Enter para continuar ingresando. Los comandos se pueden arrastrar para reordenar.',
cmdHelper: 'Ejemplo: nginx -g "daemon off;"',
entrypointHelper: 'Ejemplo: docker-entrypoint.sh',
autoRemove: 'Eliminar automáticamente',
cpuQuota: 'Cantidad de núcleos de CPU',
memoryLimit: 'Memoria',

View file

@ -887,7 +887,8 @@ const message = {
containerExample: '80または80-88',
exposePort: 'ポートを公開します',
exposeAll: 'すべてを公開します',
cmdHelper: 'コマンドを入力後Enterキーを押して入力を続行しますコマンドはドラッグで順序変更できます',
cmdHelper: ':nginx -g "daemon off;"',
entrypointHelper: ':docker-entrypoint.sh',
autoRemove: '自動削除',
cpuQuota: 'CPUコアの数',
memoryLimit: 'メモリ',

View file

@ -877,8 +877,8 @@ const message = {
containerExample: '80 또는 80-88',
exposePort: '포트 노출',
exposeAll: '모든 포트 노출',
cmdHelper:
'명령어를 입력한 Enter 키를 눌러 입력을 계속합니다. 명령어는 드래그하여 순서를 변경할 있습니다.',
cmdHelper: '예시: nginx -g "daemon off;"',
entrypointHelper: '예시: docker-entrypoint.sh',
autoRemove: '자동 제거',
cpuQuota: 'CPU 코어 ',
memoryLimit: '메모리',

View file

@ -900,8 +900,8 @@ const message = {
containerExample: '80 atau 80-88',
exposePort: 'Dedahkan port',
exposeAll: 'Dedahkan semua',
cmdHelper:
'Masukkan satu arahan dan tekan Enter untuk terus memasukkan. Arahan boleh disusun semula dengan menyeret.',
cmdHelper: 'Contoh: nginx -g "daemon off;"',
entrypointHelper: 'Contoh: docker-entrypoint.sh',
autoRemove: 'Buang automatik',
cpuQuota: 'Bilangan teras CPU',
memoryLimit: 'Memori',

View file

@ -897,8 +897,8 @@ const message = {
containerExample: '80 ou 80-88',
exposePort: 'Expor porta',
exposeAll: 'Expor todas',
cmdHelper:
'Digite um comando e pressione Enter para continuar a inserção. Os comandos podem ser arrastados para reordenar.',
cmdHelper: 'Exemplo: nginx -g "daemon off;"',
entrypointHelper: 'Exemplo: docker-entrypoint.sh',
autoRemove: 'Remover automaticamente',
cpuQuota: 'Número de núcleos de CPU',
memoryLimit: 'Memória',

View file

@ -895,8 +895,8 @@ const message = {
containerExample: '80 или 80-88',
exposePort: 'Открыть порт',
exposeAll: 'Открыть все',
cmdHelper:
'Введите команду и нажмите Enter для продолжения ввода. Команды можно перетаскивать для изменения порядка.',
cmdHelper: 'Пример: nginx -g "daemon off;"',
entrypointHelper: 'Пример: docker-entrypoint.sh',
autoRemove: 'Автоудаление',
cpuQuota: 'Количество ядер CPU',
memoryLimit: 'Память',

View file

@ -915,7 +915,8 @@ const message = {
containerExample: '80 veya 80-88',
exposePort: 'Portu göster',
exposeAll: 'Tümünü göster',
cmdHelper: "Bir komut girin ve girişe devam etmek için Enter'a basın. Komutlar sıralamak için sürüklenebilir.",
cmdHelper: 'Örnek: nginx -g "daemon off;"',
entrypointHelper: 'Örnek: docker-entrypoint.sh',
autoRemove: 'Otomatik kaldır',
cpuQuota: 'CPU çekirdek sayısı',
memoryLimit: 'Bellek',

View file

@ -864,7 +864,8 @@ const message = {
containerExample: '80 或者 80-88',
exposePort: '暴露埠',
exposeAll: '暴露所有',
cmdHelper: '輸入一個命令後回車繼續輸入命令可拖拽排序',
cmdHelper: ' nginx -g "daemon off;"',
entrypointHelper: ' docker-entrypoint.sh',
autoRemove: '容器退出後自動刪除容器',
cpuQuota: 'CPU 限制',
memoryLimit: '記憶體限制',

View file

@ -866,7 +866,8 @@ const message = {
containerExample: '80 或者 80-88',
exposePort: '暴露端口',
exposeAll: '暴露所有',
cmdHelper: '输入一个命令后回车继续输入命令可拖拽顺序',
cmdHelper: ' nginx -g "daemon off;"',
entrypointHelper: ' docker-entrypoint.sh',
autoRemove: '容器退出后自动删除容器',
cpuQuota: 'CPU 限制',
memoryLimit: '内存限制',

View file

@ -168,21 +168,21 @@
<el-tab-pane :label="$t('terminal.command')">
<el-row :gutter="20">
<el-col :xs="24" :sm="20" :md="20" :lg="20" :xl="20">
<el-form-item label="Command" prop="cmd">
<el-input-tag draggable v-model="form.cmd" />
<span class="input-help">{{ $t('container.cmdHelper') }}</span>
<el-form-item label="Command" prop="cmdStr">
<el-input
v-model="form.cmdStr"
:placeholder="$t('container.cmdHelper')"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :xs="24" :sm="20" :md="20" :lg="20" :xl="20">
<el-form-item label="Entrypoint" prop="entrypoint">
<el-input-tag
draggable
v-model="form.entrypoint"
placeholder="docker-entrypoint.sh"
<el-form-item label="Entrypoint" prop="entrypointStr">
<el-input
v-model="form.entrypointStr"
:placeholder="$t('container.entrypointHelper')"
/>
<span class="input-help">{{ $t('container.cmdHelper') }}</span>
</el-form-item>
</el-col>
</el-row>
@ -373,6 +373,8 @@ const form = reactive<Container.ContainerHelper>({
hostname: '',
domainName: '',
dns: [],
cmdStr: '',
entrypointStr: '',
memoryItem: 0,
cmd: [],
workingDir: '',
@ -416,8 +418,27 @@ const search = async () => {
form.user = res.data.user;
form.workingDir = res.data.workingDir;
let itemCmd = '';
form.cmd = res.data.cmd || [];
for (const item of form.cmd) {
if (item.indexOf(' ') !== -1) {
itemCmd += `"${escapeQuotes(item)}" `;
} else {
itemCmd += item + ' ';
}
}
form.cmdStr = itemCmd.trimEnd();
let itemEntrypoint = '';
form.entrypoint = res.data.entrypoint || [];
for (const item of form.entrypoint) {
if (item.indexOf(' ') !== -1) {
itemEntrypoint += `"${escapeQuotes(item)}" `;
} else {
itemEntrypoint += item + ' ';
}
}
form.entrypointStr = itemEntrypoint.trimEnd();
form.labels = res.data.labels || [];
form.env = res.data.env || [];
form.exposedPorts = res.data.exposedPorts || [];
@ -526,7 +547,21 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
});
};
const submit = async () => {
form.cmd = [];
form.taskID = newUUID();
if (form.cmdStr) {
let itemCmd = splitStringIgnoringQuotes(form.cmdStr);
for (const item of itemCmd) {
form.cmd.push(item.replace(/(?<!\\)"/g, '').replaceAll('\\"', '"'));
}
}
form.entrypoint = [];
if (form.entrypointStr) {
let itemEntrypoint = splitStringIgnoringQuotes(form.entrypointStr);
for (const item of itemEntrypoint) {
form.entrypoint.push(item.replace(/(?<!\\)"/g, '').replaceAll('\\"', '"'));
}
}
if (form.publishAllPorts) {
form.exposedPorts = [];
} else {
@ -641,6 +676,27 @@ const checkExist = async () => {
});
};
const escapeQuotes = (input) => {
return input.replace(/(?<!\\)"/g, '\\"');
};
const splitStringIgnoringQuotes = (input) => {
input = input.replace(/\\"/g, '<quota>');
const regex = /"([^"]*)"|(\S+)/g;
const result = [];
let match;
while ((match = regex.exec(input)) !== null) {
if (match[1]) {
result.push(match[1].replaceAll('<quota>', '\\"'));
} else if (match[2]) {
result.push(match[2].replaceAll('<quota>', '\\"'));
}
}
return result;
};
onMounted(() => {
if (router.currentRoute.value.query.name) {
isCreate.value = false;