🐛 终端无法粘贴.

This commit is contained in:
lijiahangmax
2024-03-24 14:40:42 +08:00
parent 1125ef8a5a
commit cf188451dd
11 changed files with 9358 additions and 8374 deletions

View File

@@ -7,8 +7,11 @@
* 🚀 升级 `arco design``2.55.0` * 🚀 升级 `arco design``2.55.0`
* 🐞 修复 新创建的用户登录会跳转到 **404** * 🐞 修复 新创建的用户登录会跳转到 **404**
* 🐞 修复 分配菜单模态框没有子菜单不显示的问题 * 🐞 修复 分配菜单模态框没有子菜单不显示的问题
* 🐞 修复 终端无法粘贴
* 🐞 修复 `工作台` `快捷操作` 会展示隐藏的菜单 * 🐞 修复 `工作台` `快捷操作` 会展示隐藏的菜单
* 🔨 修改 系统菜单渲染逻辑 (移除 JSX 构建时不会提示 JSX.IntrinsicElements) * 🔨 修改 系统菜单渲染逻辑 (移除 JSX 构建时不会提示 JSX.IntrinsicElements)
[如何升级](/about/update.md?id=_v103)
## v1.0.2 ## v1.0.2

View File

@@ -1,5 +1,13 @@
⚡ 注意: 应用不支持跨版本升级, 可以进行多次升级 ⚡ 注意: 应用不支持跨版本升级, 可以进行多次升级
## v1.0.3
> sql 脚本
```sql
DELETE FROM preference WHERE type = 'TERMINAL';
```
## v1.0.2 ## v1.0.2
> sql 脚本 > sql 脚本

View File

@@ -74,7 +74,7 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
new TerminalPreferenceModel.ShortcutKeysModel("changeToNextSession", true, false, true, "BracketRight", true), new TerminalPreferenceModel.ShortcutKeysModel("changeToNextSession", true, false, true, "BracketRight", true),
// 终端快捷键 // 终端快捷键
new TerminalPreferenceModel.ShortcutKeysModel("copy", true, true, false, "KeyC", true), new TerminalPreferenceModel.ShortcutKeysModel("copy", true, true, false, "KeyC", true),
new TerminalPreferenceModel.ShortcutKeysModel("paste", true, true, false, "KeyV", true), new TerminalPreferenceModel.ShortcutKeysModel("paste", true, true, false, "Insert", true),
new TerminalPreferenceModel.ShortcutKeysModel("toTop", true, true, false, "ArrowUp", true), new TerminalPreferenceModel.ShortcutKeysModel("toTop", true, true, false, "ArrowUp", true),
new TerminalPreferenceModel.ShortcutKeysModel("toBottom", true, true, false, "ArrowDown", true), new TerminalPreferenceModel.ShortcutKeysModel("toBottom", true, true, false, "ArrowDown", true),
new TerminalPreferenceModel.ShortcutKeysModel("selectAll", true, true, false, "KeyA", true), new TerminalPreferenceModel.ShortcutKeysModel("selectAll", true, true, false, "KeyA", true),
@@ -94,7 +94,7 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
.selectAll(false) .selectAll(false)
.search(true) .search(true)
.copy(true) .copy(true)
.paste(true) .paste(false)
.interrupt(false) .interrupt(false)
.enter(false) .enter(false)
.fontSizePlus(false) .fontSizePlus(false)
@@ -112,7 +112,7 @@ public class TerminalPreferenceStrategy implements IPreferenceStrategy<TerminalP
.theme(new JSONObject()) .theme(new JSONObject())
.displaySetting(JSONObject.parseObject(defaultDisplaySetting)) .displaySetting(JSONObject.parseObject(defaultDisplaySetting))
.actionBarSetting(JSONObject.parseObject(actionBarSetting)) .actionBarSetting(JSONObject.parseObject(actionBarSetting))
.rightMenuSetting(Lists.of("copy", "paste", "checkAll", "search", "clear")) .rightMenuSetting(Lists.of("selectAll", "copy", "fontSizePlus", "fontSizeSubtract", "search", "clear"))
.interactSetting(JSONObject.parseObject(defaultInteractSetting)) .interactSetting(JSONObject.parseObject(defaultInteractSetting))
.pluginsSetting(JSONObject.parseObject(defaultPluginsSetting)) .pluginsSetting(JSONObject.parseObject(defaultPluginsSetting))
.sessionSetting(JSONObject.parseObject(defaultSessionSetting)) .sessionSetting(JSONObject.parseObject(defaultSessionSetting))

17628
orion-ops-ui/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,7 @@ export const readText = () => {
try { try {
const success = document.execCommand('paste'); const success = document.execCommand('paste');
if (!success) { if (!success) {
Message.error('当前浏览器无法读取剪切板内容'); Message.error('当前环境无法读取剪切板内容');
} }
resolve(textarea.value); resolve(textarea.value);
} catch (error) { } catch (error) {
@@ -53,7 +53,10 @@ export const copyToClipboard = async (value: string) => {
document.body.appendChild(textarea); document.body.appendChild(textarea);
textarea.select(); textarea.select();
try { try {
document.execCommand('copy'); const success = document.execCommand('copy');
if (!success) {
Message.error('当前环境无法复制到剪切板');
}
} catch (error) { } catch (error) {
throw error; throw error;
} finally { } finally {

View File

@@ -41,7 +41,7 @@
v-model="formModel.copyAutoTrim" /> v-model="formModel.copyAutoTrim" />
</block-setting-item> </block-setting-item>
<!-- 粘贴去除空格 --> <!-- 粘贴去除空格 -->
<block-setting-item label="粘贴去除空格" desc="粘贴文本前自动删除尾部空格 如: 命令输入框, 命令编辑器, 右键粘贴, 粘贴按钮, 右键菜单粘贴, 自定义粘贴快捷键"> <block-setting-item label="粘贴去除空格" desc="粘贴文本前自动删除尾部空格 如: 命令输入框, 命令编辑器, 右键粘贴, 粘贴按钮, 右键菜单粘贴, 自定义粘贴快捷键 (内置粘贴快捷键因浏览器限制不会去除)">
<a-switch type="round" <a-switch type="round"
v-model="formModel.pasteAutoTrim" /> v-model="formModel.pasteAutoTrim" />
</block-setting-item> </block-setting-item>

View File

@@ -26,7 +26,7 @@
<!-- 启用-未修改 --> <!-- 启用-未修改 -->
<span v-else-if="item.enabled">{{ item.shortcutKey }}</span> <span v-else-if="item.enabled">{{ item.shortcutKey }}</span>
<!-- 禁用 --> <!-- 禁用 -->
<span v-else /> <span v-else class="disabled-key">已禁用</span>
</div> </div>
<!-- 操作 --> <!-- 操作 -->
<a-space class="shortcut-actions-container"> <a-space class="shortcut-actions-container">
@@ -52,6 +52,13 @@
<icon-settings /> <icon-settings />
</div> </div>
</a-space> </a-space>
<!-- 描述 -->
<div class="shortcut-desc">
<!-- 粘贴描述 -->
<template v-if="item.item === TerminalShortcutKeys.PASTE">
Ctrl + Shift + V, Shift + Insert 为浏览器内置快捷键, 不受环境影响
</template>
</div>
</div> </div>
</template> </template>
</div> </div>
@@ -68,6 +75,7 @@
import type { TerminalShortcutKeyEditable } from '@/store/modules/terminal/types'; import type { TerminalShortcutKeyEditable } from '@/store/modules/terminal/types';
import type { VNodeRef } from 'vue'; import type { VNodeRef } from 'vue';
import { setAutoFocus } from '@/utils/dom'; import { setAutoFocus } from '@/utils/dom';
import { TerminalShortcutKeys } from '../../../types/terminal.const';
defineProps<{ defineProps<{
title: string; title: string;
@@ -116,6 +124,10 @@
.shortcut-actions-container { .shortcut-actions-container {
display: flex; display: flex;
} }
.shortcut-desc {
display: none;
}
} }
.shortcut-name { .shortcut-name {
@@ -132,6 +144,11 @@
} }
} }
.shortcut-desc {
display: flex;
font-size: 12px;
}
.shortcut-actions-container { .shortcut-actions-container {
display: none; display: none;
@@ -144,6 +161,10 @@
} }
} }
} }
.disabled-key {
color: var(--color-neutral-6);
}
} }
</style> </style>

View File

@@ -16,18 +16,22 @@ const preventKeys: Array<ShortcutKey> = [
altKey: false, altKey: false,
shiftKey: true, shiftKey: true,
code: 'KeyC' code: 'KeyC'
} },
// , { ];
// ctrlKey: true,
// altKey: false, // 内置快捷键
// shiftKey: true, const builtinKeys: Array<ShortcutKey> = [
// code: 'KeyV' {
// }, { ctrlKey: true,
// ctrlKey: false, altKey: false,
// altKey: false, shiftKey: true,
// shiftKey: true, code: 'KeyV'
// code: 'Insert' }, {
// }, ctrlKey: false,
altKey: false,
shiftKey: true,
code: 'Insert'
},
]; ];
const { copy: copyValue, readText } = useCopy(); const { copy: copyValue, readText } = useCopy();
@@ -50,16 +54,13 @@ export default class SshSessionHandler implements ISshSessionHandler {
this.session = session; this.session = session;
this.inst = session.inst; this.inst = session.inst;
this.domRef = domRef; this.domRef = domRef;
const { preference, tabManager } = useTerminalStore(); const { preference } = useTerminalStore();
this.interactSetting = preference.interactSetting; this.interactSetting = preference.interactSetting;
this.shortcutKeys = preference.shortcutSetting.keys; this.shortcutKeys = preference.shortcutSetting.keys;
} }
// 检测是否忽略默认行为 // 检测是否忽略默认行为
checkPreventDefault(e: KeyboardEvent): boolean { checkPreventDefault(e: KeyboardEvent): boolean {
if (e.type !== 'keydown') {
return false;
}
return !!preventKeys.find(key => { return !!preventKeys.find(key => {
return key.code === e.code return key.code === e.code
&& key.altKey === e.altKey && key.altKey === e.altKey
@@ -68,6 +69,16 @@ export default class SshSessionHandler implements ISshSessionHandler {
}); });
} }
// 检测是否为内置快捷键
checkIsBuiltin(e: KeyboardEvent): boolean {
return !!builtinKeys.find(key => {
return key.code === e.code
&& key.altKey === e.altKey
&& key.shiftKey === e.shiftKey
&& key.ctrlKey === e.ctrlKey;
});
}
// 启用状态 // 启用状态
enabledStatus(option: string): boolean { enabledStatus(option: string): boolean {
switch (option) { switch (option) {

View File

@@ -85,6 +85,10 @@ export default class SshSession implements ISshSession {
if (e.type !== 'keydown') { if (e.type !== 'keydown') {
return true; return true;
} }
// 检测是否为内置快捷键
if (this.handler.checkIsBuiltin(e)) {
return true;
}
// 检测是否阻止默认行为 // 检测是否阻止默认行为
if (this.handler.checkPreventDefault(e)) { if (this.handler.checkPreventDefault(e)) {
e.preventDefault(); e.preventDefault();

View File

@@ -212,6 +212,8 @@ export const TerminalShortcutKeys = {
CHANGE_TO_PREV_SESSION: 'changeToPrevSession', CHANGE_TO_PREV_SESSION: 'changeToPrevSession',
// 切换至后一个会话 // 切换至后一个会话
CHANGE_TO_NEXT_SESSION: 'changeToNextSession', CHANGE_TO_NEXT_SESSION: 'changeToNextSession',
// 粘贴
PASTE: 'paste',
}; };
// 终端操作快捷键 // 终端操作快捷键
@@ -257,7 +259,7 @@ export const TerminalShortcutItems: Array<ShortcutKeyItem> = [
content: '复制', content: '复制',
type: TerminalShortcutType.TERMINAL type: TerminalShortcutType.TERMINAL
}, { }, {
item: 'paste', item: TerminalShortcutKeys.PASTE,
content: '粘贴', content: '粘贴',
type: TerminalShortcutType.TERMINAL type: TerminalShortcutType.TERMINAL
}, { }, {

View File

@@ -267,6 +267,8 @@ export interface ISshSession extends ITerminalSession {
export interface ISshSessionHandler { export interface ISshSessionHandler {
// 检测是否忽略默认行为 // 检测是否忽略默认行为
checkPreventDefault: (e: KeyboardEvent) => boolean; checkPreventDefault: (e: KeyboardEvent) => boolean;
// 检测是否为内置快捷键
checkIsBuiltin: (e: KeyboardEvent) => boolean;
// 启用状态 // 启用状态
enabledStatus: (option: string) => boolean; enabledStatus: (option: string) => boolean;
// 调用处理方法 // 调用处理方法