mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 15:24:35 +01:00
#25 snippet in SSH
This commit is contained in:
@@ -3,11 +3,17 @@ import 'dart:io';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
import 'package:toolbox/core/utils/misc.dart';
|
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
|
import '../../data/model/server/snippet.dart';
|
||||||
|
import '../../data/provider/snippet.dart';
|
||||||
|
import '../../locator.dart';
|
||||||
|
import '../../view/page/snippet/edit.dart';
|
||||||
import '../../view/widget/card_dialog.dart';
|
import '../../view/widget/card_dialog.dart';
|
||||||
|
import '../../view/widget/picker.dart';
|
||||||
import '../persistant_store.dart';
|
import '../persistant_store.dart';
|
||||||
|
import '../route.dart';
|
||||||
|
import 'misc.dart';
|
||||||
import 'platform.dart';
|
import 'platform.dart';
|
||||||
import '../extension/stringx.dart';
|
import '../extension/stringx.dart';
|
||||||
import '../extension/uint8list.dart';
|
import '../extension/uint8list.dart';
|
||||||
@@ -113,3 +119,48 @@ Future<void> loadFontFile(String? localPath) async {
|
|||||||
fontLoader.addFont(File(localPath).readAsBytes().byteData);
|
fontLoader.addFont(File(localPath).readAsBytes().byteData);
|
||||||
await fontLoader.load();
|
await fontLoader.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void showSnippetDialog(
|
||||||
|
BuildContext context, S s, Function(Snippet s) onSelected) {
|
||||||
|
final provider = locator<SnippetProvider>();
|
||||||
|
if (provider.snippets.isEmpty) {
|
||||||
|
showRoundDialog(
|
||||||
|
context,
|
||||||
|
s.attention,
|
||||||
|
Text(s.noSavedSnippet),
|
||||||
|
[
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
child: Text(s.ok),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
AppRoute(const SnippetEditPage(), 'edit snippet').go(context);
|
||||||
|
},
|
||||||
|
child: Text(s.addOne),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var snippet = provider.snippets.first;
|
||||||
|
showRoundDialog(
|
||||||
|
context,
|
||||||
|
s.choose,
|
||||||
|
buildPicker(
|
||||||
|
provider.snippets.map((e) => Text(e.name)).toList(),
|
||||||
|
(idx) => snippet = provider.snippets[idx],
|
||||||
|
),
|
||||||
|
[
|
||||||
|
TextButton(
|
||||||
|
onPressed: () async {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
onSelected(snippet);
|
||||||
|
},
|
||||||
|
child: Text(s.ok),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import '../../../data/model/server/server.dart';
|
|||||||
import '../../../data/model/server/server_private_info.dart';
|
import '../../../data/model/server/server_private_info.dart';
|
||||||
import '../../../data/model/server/server_status.dart';
|
import '../../../data/model/server/server_status.dart';
|
||||||
import '../../../data/provider/server.dart';
|
import '../../../data/provider/server.dart';
|
||||||
import '../../../data/provider/snippet.dart';
|
|
||||||
import '../../../data/res/color.dart';
|
import '../../../data/res/color.dart';
|
||||||
import '../../../data/res/menu.dart';
|
import '../../../data/res/menu.dart';
|
||||||
import '../../../data/res/ui.dart';
|
import '../../../data/res/ui.dart';
|
||||||
@@ -19,13 +18,11 @@ import '../../../data/res/url.dart';
|
|||||||
import '../../../data/store/setting.dart';
|
import '../../../data/store/setting.dart';
|
||||||
import '../../../locator.dart';
|
import '../../../locator.dart';
|
||||||
import '../../widget/dropdown_menu.dart';
|
import '../../widget/dropdown_menu.dart';
|
||||||
import '../../widget/picker.dart';
|
|
||||||
import '../../widget/round_rect_card.dart';
|
import '../../widget/round_rect_card.dart';
|
||||||
import '../../widget/url_text.dart';
|
import '../../widget/url_text.dart';
|
||||||
import '../docker.dart';
|
import '../docker.dart';
|
||||||
import '../pkg.dart';
|
import '../pkg.dart';
|
||||||
import '../sftp/view.dart';
|
import '../sftp/view.dart';
|
||||||
import '../snippet/edit.dart';
|
|
||||||
import '../ssh.dart';
|
import '../ssh.dart';
|
||||||
import 'detail.dart';
|
import 'detail.dart';
|
||||||
import 'edit.dart';
|
import 'edit.dart';
|
||||||
@@ -266,7 +263,21 @@ class _ServerPageState extends State<ServerPage>
|
|||||||
AppRoute(SFTPPage(spi), 'SFTP').go(context);
|
AppRoute(SFTPPage(spi), 'SFTP').go(context);
|
||||||
break;
|
break;
|
||||||
case ServerTabMenuItems.snippet:
|
case ServerTabMenuItems.snippet:
|
||||||
_showSnippetDialog(spi.id);
|
showSnippetDialog(context, _s, (s) async {
|
||||||
|
final result =
|
||||||
|
await locator<ServerProvider>().runSnippet(spi.id, s);
|
||||||
|
showRoundDialog(
|
||||||
|
context,
|
||||||
|
_s.result,
|
||||||
|
Text(result ?? _s.error, style: textSize13),
|
||||||
|
[
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
child: Text(_s.ok),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
case ServerTabMenuItems.edit:
|
case ServerTabMenuItems.edit:
|
||||||
AppRoute(ServerEditPage(spi: spi), 'Edit server info').go(context);
|
AppRoute(ServerEditPage(spi: spi), 'Edit server info').go(context);
|
||||||
@@ -382,61 +393,6 @@ class _ServerPageState extends State<ServerPage>
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _showSnippetDialog(String id) {
|
|
||||||
final provider = locator<SnippetProvider>();
|
|
||||||
if (provider.snippets.isEmpty) {
|
|
||||||
showRoundDialog(
|
|
||||||
context,
|
|
||||||
_s.attention,
|
|
||||||
Text(_s.noSavedSnippet),
|
|
||||||
[
|
|
||||||
TextButton(
|
|
||||||
onPressed: () => Navigator.pop(context),
|
|
||||||
child: Text(_s.ok),
|
|
||||||
),
|
|
||||||
TextButton(
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
AppRoute(const SnippetEditPage(), 'edit snippet').go(context);
|
|
||||||
},
|
|
||||||
child: Text(_s.addOne),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var snippet = provider.snippets.first;
|
|
||||||
showRoundDialog(
|
|
||||||
context,
|
|
||||||
_s.choose,
|
|
||||||
buildPicker(
|
|
||||||
provider.snippets.map((e) => Text(e.name)).toList(),
|
|
||||||
(idx) => snippet = provider.snippets[idx],
|
|
||||||
),
|
|
||||||
[
|
|
||||||
TextButton(
|
|
||||||
onPressed: () async {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
final result = await _serverProvider.runSnippet(id, snippet);
|
|
||||||
showRoundDialog(
|
|
||||||
context,
|
|
||||||
_s.result,
|
|
||||||
Text(result ?? _s.error, style: textSize13),
|
|
||||||
[
|
|
||||||
TextButton(
|
|
||||||
onPressed: () => Navigator.of(context).pop(),
|
|
||||||
child: Text(_s.ok),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: Text(_s.run),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get wantKeepAlive => true;
|
bool get wantKeepAlive => true;
|
||||||
|
|
||||||
|
|||||||
@@ -275,8 +275,10 @@ class _SSHPageState extends State<SSHPage> {
|
|||||||
copy(terminalSelected);
|
copy(terminalSelected);
|
||||||
break;
|
break;
|
||||||
case VirtualKeyFunc.snippet:
|
case VirtualKeyFunc.snippet:
|
||||||
// TODO: Handle this case.
|
showSnippetDialog(context, _s, (s) {
|
||||||
// _showSnippet();
|
_terminal.textInput(s.script);
|
||||||
|
_terminal.keyInput(TerminalKey.enter);
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user