fix & opt.
- fix: ssh paste - opt.: docker logs & shell
This commit is contained in:
@@ -492,7 +492,7 @@ class SZh extends S {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String sureDelete(Object name) {
|
String sureDelete(Object name) {
|
||||||
return '确定删除[$name]?';
|
return '确定删除 [$name]?';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -1078,7 +1078,7 @@ class SZhTw extends SZh {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String sureDelete(Object name) {
|
String sureDelete(Object name) {
|
||||||
return '確定刪除[$name]?';
|
return '確定刪除 [$name]?';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -30,8 +30,7 @@ Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartss
|
|||||||
- [x] `Docker & Pkg` Manager
|
- [x] `Docker & Pkg` Manager
|
||||||
- [x] Status charts
|
- [x] Status charts
|
||||||
- [x] `Ping` and etc.
|
- [x] `Ping` and etc.
|
||||||
- [x] i18n (English, 简体中文, Deutsch)
|
- [x] Localization ( English, 简体中文, Deutsch, 繁體中文. [How to contribute?](#l10n-guide))
|
||||||
- Welcome contribution :), [How to contribute?](#l10n-guide)
|
|
||||||
- [x] Desktop support
|
- [x] Desktop support
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,7 @@
|
|||||||
- [x] `Docker & 包` 管理器
|
- [x] `Docker & 包` 管理器
|
||||||
- [x] 状态图表
|
- [x] 状态图表
|
||||||
- [x] `Ping` 和 更多
|
- [x] `Ping` 和 更多
|
||||||
- [x] 本地化 ( English, 简体中文, Deutsch )
|
- [x] 本地化 ( English, 简体中文, Deutsch, 繁體中文。 [如何贡献?](#l10n-guide))
|
||||||
- 欢迎贡献 :),[怎么贡献?](#l10n)
|
|
||||||
- [x] 桌面端支持
|
- [x] 桌面端支持
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ enum DockerMenuType {
|
|||||||
|
|
||||||
static List<DockerMenuType> items(bool running) {
|
static List<DockerMenuType> items(bool running) {
|
||||||
if (running) {
|
if (running) {
|
||||||
return [stop, restart, rm, logs];
|
return [stop, restart, rm, logs, terminal];
|
||||||
} else {
|
} else {
|
||||||
return [start, rm, logs];
|
return [start, rm, logs];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,14 +163,6 @@ class DockerProvider extends BusyProvider {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> logs(String id) async {
|
|
||||||
setBusyState();
|
|
||||||
final cmd = _wrap('docker logs $id');
|
|
||||||
final result = await client!.run(cmd);
|
|
||||||
setBusyState(false);
|
|
||||||
return result.string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// judge whether to use DOCKER_HOST / sudo
|
// judge whether to use DOCKER_HOST / sudo
|
||||||
String _wrap(String cmd) {
|
String _wrap(String cmd) {
|
||||||
final dockerHost = dockerStore.getDockerHost(hostId!);
|
final dockerHost = dockerStore.getDockerHost(hostId!);
|
||||||
|
|||||||
@@ -152,7 +152,7 @@
|
|||||||
"start": "开始",
|
"start": "开始",
|
||||||
"stop": "停止",
|
"stop": "停止",
|
||||||
"success": "成功",
|
"success": "成功",
|
||||||
"sureDelete": "确定删除[{name}]?",
|
"sureDelete": "确定删除 [{name}]?",
|
||||||
"sureDirEmpty": "请确保文件夹为空",
|
"sureDirEmpty": "请确保文件夹为空",
|
||||||
"sureNoPwd": "确认使用无密码?",
|
"sureNoPwd": "确认使用无密码?",
|
||||||
"sureToDeleteServer": "你确定要删除服务器 [{server}] 吗?",
|
"sureToDeleteServer": "你确定要删除服务器 [{server}] 吗?",
|
||||||
|
|||||||
@@ -152,7 +152,7 @@
|
|||||||
"start": "開始",
|
"start": "開始",
|
||||||
"stop": "停止",
|
"stop": "停止",
|
||||||
"success": "成功",
|
"success": "成功",
|
||||||
"sureDelete": "確定刪除[{name}]?",
|
"sureDelete": "確定刪除 [{name}]?",
|
||||||
"sureDirEmpty": "請確保文件夾為空",
|
"sureDirEmpty": "請確保文件夾為空",
|
||||||
"sureNoPwd": "確認使用無密碼?",
|
"sureNoPwd": "確認使用無密碼?",
|
||||||
"sureToDeleteServer": "你確定要刪除服務器 [{server}] 嗎?",
|
"sureToDeleteServer": "你確定要刪除服務器 [{server}] 嗎?",
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:toolbox/core/extension/navigator.dart';
|
import 'package:toolbox/core/extension/navigator.dart';
|
||||||
import 'package:toolbox/core/route.dart';
|
import 'package:toolbox/core/route.dart';
|
||||||
import 'package:toolbox/core/utils/misc.dart';
|
|
||||||
import 'package:toolbox/view/page/ssh.dart';
|
import 'package:toolbox/view/page/ssh.dart';
|
||||||
import 'package:toolbox/view/widget/input_field.dart';
|
import 'package:toolbox/view/widget/input_field.dart';
|
||||||
|
|
||||||
@@ -154,7 +153,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
|||||||
context.pop();
|
context.pop();
|
||||||
final result = await _docker.run(cmd);
|
final result = await _docker.run(cmd);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
showSnackBar(context, Text(getErrMsg(result) ?? _s.unknownError));
|
showSnackBar(context, Text(result.message ?? _s.unknownError));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: Text(_s.run),
|
child: Text(_s.run),
|
||||||
@@ -176,13 +175,6 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
|||||||
return 'docker run -itd --name $name $suffix';
|
return 'docker run -itd --name $name $suffix';
|
||||||
}
|
}
|
||||||
|
|
||||||
String? getErrMsg(DockerErr err) {
|
|
||||||
switch (err.type) {
|
|
||||||
default:
|
|
||||||
return err.message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void onSubmitted() {
|
void onSubmitted() {
|
||||||
if (_textController.text == '') {
|
if (_textController.text == '') {
|
||||||
showRoundDialog(
|
showRoundDialog(
|
||||||
@@ -308,7 +300,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
|||||||
if (result != null) {
|
if (result != null) {
|
||||||
showSnackBar(
|
showSnackBar(
|
||||||
context,
|
context,
|
||||||
Text(getErrMsg(result) ?? _s.unknownError),
|
Text(result.message ?? _s.unknownError),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -354,24 +346,25 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildEditHost() {
|
Widget _buildEditHost() {
|
||||||
if (_docker.items!.isNotEmpty || _docker.images!.isNotEmpty) {
|
final children = <Widget>[];
|
||||||
return placeholder;
|
if (_docker.items!.isEmpty && _docker.images!.isEmpty) {
|
||||||
|
children.add(Padding(
|
||||||
|
padding: const EdgeInsets.fromLTRB(17, 17, 17, 0),
|
||||||
|
child: Text(
|
||||||
|
_s.dockerEmptyRunningItems,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
return Padding(
|
children.add(
|
||||||
padding: const EdgeInsets.fromLTRB(17, 17, 17, 0),
|
TextButton(
|
||||||
child: Column(
|
onPressed: _showEditHostDialog,
|
||||||
children: [
|
child: Text(_s.dockerEditHost),
|
||||||
Text(
|
|
||||||
_s.dockerEmptyRunningItems,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
TextButton(
|
|
||||||
onPressed: () => _showEditHostDialog(),
|
|
||||||
child: Text(_s.dockerEditHost),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
return Column(
|
||||||
|
children: children,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _showEditHostDialog() async {
|
Future<void> _showEditHostDialog() async {
|
||||||
@@ -483,6 +476,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
|||||||
case DockerMenuType.rm:
|
case DockerMenuType.rm:
|
||||||
showRoundDialog(
|
showRoundDialog(
|
||||||
context: context,
|
context: context,
|
||||||
|
title: Text(_s.attention),
|
||||||
child: Text(_s.sureDelete(dItem.name)),
|
child: Text(_s.sureDelete(dItem.name)),
|
||||||
actions: [
|
actions: [
|
||||||
TextButton(
|
TextButton(
|
||||||
@@ -505,19 +499,13 @@ class _DockerManagePageState extends State<DockerManagePage> {
|
|||||||
_docker.restart(dItem.containerId);
|
_docker.restart(dItem.containerId);
|
||||||
break;
|
break;
|
||||||
case DockerMenuType.logs:
|
case DockerMenuType.logs:
|
||||||
final logs = await _docker.logs(dItem.containerId);
|
AppRoute(
|
||||||
showRoundDialog(
|
SSHPage(
|
||||||
context: context,
|
spi: widget.spi,
|
||||||
child: SingleChildScrollView(
|
initCmd: 'docker logs ${dItem.containerId}',
|
||||||
child: Text(logs),
|
|
||||||
),
|
),
|
||||||
actions: [
|
'Docker logs',
|
||||||
TextButton(
|
).go(context);
|
||||||
onPressed: () => copy2Clipboard(logs),
|
|
||||||
child: Text(_s.copy),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
case DockerMenuType.terminal:
|
case DockerMenuType.terminal:
|
||||||
AppRoute(
|
AppRoute(
|
||||||
|
|||||||
@@ -288,6 +288,9 @@ class _SSHPageState extends State<SSHPage> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (children.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
_menuController.show(
|
_menuController.show(
|
||||||
context: context,
|
context: context,
|
||||||
contextMenuBuilder: (context) {
|
contextMenuBuilder: (context) {
|
||||||
@@ -343,7 +346,7 @@ class _SSHPageState extends State<SSHPage> {
|
|||||||
_listen(session.stderr);
|
_listen(session.stderr);
|
||||||
|
|
||||||
if (widget.initCmd != null) {
|
if (widget.initCmd != null) {
|
||||||
_terminal.write(widget.initCmd!);
|
_terminal.textInput(widget.initCmd!);
|
||||||
_terminal.keyInput(TerminalKey.enter);
|
_terminal.keyInput(TerminalKey.enter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user