mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
default: mac window size & opt.: snippet result
This commit is contained in:
@@ -209,7 +209,7 @@ class AppRoute {
|
|||||||
return AppRoute(AndroidSettingsPage(key: key), 'android_setting');
|
return AppRoute(AndroidSettingsPage(key: key), 'android_setting');
|
||||||
}
|
}
|
||||||
|
|
||||||
static AppRoute snippetResult({Key? key, required Map<String, String?> results}) {
|
static AppRoute snippetResult({Key? key, required List<SnippetResult?> results}) {
|
||||||
return AppRoute(
|
return AppRoute(
|
||||||
SnippetResultPage(
|
SnippetResultPage(
|
||||||
key: key,
|
key: key,
|
||||||
|
|||||||
@@ -7,15 +7,15 @@ enum ServerTabMenuType {
|
|||||||
docker,
|
docker,
|
||||||
process,
|
process,
|
||||||
pkg,
|
pkg,
|
||||||
snippet,
|
//snippet,
|
||||||
;
|
;
|
||||||
|
|
||||||
IconData get icon {
|
IconData get icon {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case ServerTabMenuType.sftp:
|
case ServerTabMenuType.sftp:
|
||||||
return Icons.insert_drive_file;
|
return Icons.insert_drive_file;
|
||||||
case ServerTabMenuType.snippet:
|
//case ServerTabMenuType.snippet:
|
||||||
return Icons.code;
|
//return Icons.code;
|
||||||
case ServerTabMenuType.pkg:
|
case ServerTabMenuType.pkg:
|
||||||
return Icons.system_security_update;
|
return Icons.system_security_update;
|
||||||
case ServerTabMenuType.docker:
|
case ServerTabMenuType.docker:
|
||||||
@@ -31,8 +31,8 @@ enum ServerTabMenuType {
|
|||||||
switch (this) {
|
switch (this) {
|
||||||
case ServerTabMenuType.sftp:
|
case ServerTabMenuType.sftp:
|
||||||
return 'SFTP';
|
return 'SFTP';
|
||||||
case ServerTabMenuType.snippet:
|
//case ServerTabMenuType.snippet:
|
||||||
return l10n.snippet;
|
//return l10n.snippet;
|
||||||
case ServerTabMenuType.pkg:
|
case ServerTabMenuType.pkg:
|
||||||
return l10n.pkg;
|
return l10n.pkg;
|
||||||
case ServerTabMenuType.docker:
|
case ServerTabMenuType.docker:
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import '../server/system.dart';
|
|||||||
|
|
||||||
const seperator = 'SrvBoxSep';
|
const seperator = 'SrvBoxSep';
|
||||||
|
|
||||||
|
/// The suffix `\t` is for formatting
|
||||||
const _cmdDivider = '\necho $seperator\n\t';
|
const _cmdDivider = '\necho $seperator\n\t';
|
||||||
|
|
||||||
const _serverBoxDir = r'$HOME/.config/server_box';
|
const _serverBoxDir = r'$HOME/.config/server_box';
|
||||||
|
|||||||
@@ -45,3 +45,15 @@ class Snippet implements TagPickable {
|
|||||||
@override
|
@override
|
||||||
String get tagName => name;
|
String get tagName => name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SnippetResult {
|
||||||
|
final String? dest;
|
||||||
|
final String result;
|
||||||
|
final Duration time;
|
||||||
|
|
||||||
|
SnippetResult({
|
||||||
|
required this.dest,
|
||||||
|
required this.result,
|
||||||
|
required this.time,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -362,18 +362,26 @@ class ServerProvider extends ChangeNotifier {
|
|||||||
_limiter.reset(sid);
|
_limiter.reset(sid);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String?> runSnippets(String id, List<Snippet> snippets) async {
|
Future<SnippetResult?> runSnippets(String id, Snippet snippet) async {
|
||||||
final client = _servers[id]?.client;
|
final client = _servers[id]?.client;
|
||||||
if (client == null) {
|
if (client == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return await client.run(snippets.map((e) => e.script).join('&&')).string;
|
final watch = Stopwatch()..start();
|
||||||
|
final result = await client.run(snippet.script).string;
|
||||||
|
final time = watch.elapsed;
|
||||||
|
watch.stop();
|
||||||
|
return SnippetResult(
|
||||||
|
dest: _servers[id]?.spi.name,
|
||||||
|
result: result,
|
||||||
|
time: time,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<String?>> runSnippetsMulti(
|
Future<List<SnippetResult?>> runSnippetsMulti(
|
||||||
List<String> ids,
|
List<String> ids,
|
||||||
List<Snippet> snippets,
|
Snippet snippet,
|
||||||
) async {
|
) async {
|
||||||
return await Future.wait(ids.map((id) async => runSnippets(id, snippets)));
|
return await Future.wait(ids.map((id) async => runSnippets(id, snippet)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,5 +38,6 @@ class GithubIds {
|
|||||||
'a1564471347',
|
'a1564471347',
|
||||||
'fanzhebufan1',
|
'fanzhebufan1',
|
||||||
'wcbing',
|
'wcbing',
|
||||||
|
'balh55y',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,15 +134,9 @@ class _SnippetListPageState extends State<SnippetListPage> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final ids = servers.map((e) => e.spi.id).toList();
|
final ids = servers.map((e) => e.spi.id).toList();
|
||||||
final names = servers.map((e) => e.spi.name).toList();
|
final results = await Pros.server.runSnippetsMulti(ids, snippet);
|
||||||
final results = await Pros.server.runSnippetsMulti(ids, [snippet]);
|
|
||||||
if (results.isNotEmpty) {
|
if (results.isNotEmpty) {
|
||||||
// SERVER_NAME: RESULT
|
AppRoute.snippetResult(results: results).go(context);
|
||||||
final result = Map.fromIterables(
|
|
||||||
names,
|
|
||||||
results,
|
|
||||||
);
|
|
||||||
AppRoute.snippetResult(results: result).go(context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:toolbox/core/extension/context/locale.dart';
|
||||||
|
import 'package:toolbox/data/model/server/snippet.dart';
|
||||||
|
import 'package:toolbox/data/res/ui.dart';
|
||||||
import 'package:toolbox/view/widget/cardx.dart';
|
import 'package:toolbox/view/widget/cardx.dart';
|
||||||
import 'package:toolbox/view/widget/custom_appbar.dart';
|
import 'package:toolbox/view/widget/custom_appbar.dart';
|
||||||
import 'package:toolbox/view/widget/expand_tile.dart';
|
import 'package:toolbox/view/widget/expand_tile.dart';
|
||||||
|
|
||||||
class SnippetResultPage extends StatelessWidget {
|
class SnippetResultPage extends StatelessWidget {
|
||||||
final Map<String, String?> results;
|
final List<SnippetResult?> results;
|
||||||
|
|
||||||
const SnippetResultPage({super.key, required this.results});
|
const SnippetResultPage({super.key, required this.results});
|
||||||
|
|
||||||
@@ -20,28 +22,30 @@ class SnippetResultPage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildBody() {
|
Widget _buildBody() {
|
||||||
return Align(
|
return ListView.builder(
|
||||||
alignment: Alignment.centerLeft,
|
padding: const EdgeInsets.symmetric(horizontal: 17),
|
||||||
child: ListView.builder(
|
itemCount: results.length,
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 17),
|
itemBuilder: (_, index) {
|
||||||
itemCount: results.length,
|
final item = results[index];
|
||||||
itemBuilder: (_, index) {
|
if (item == null) return UIs.placeholder;
|
||||||
final key = results.keys.elementAt(index);
|
return CardX(
|
||||||
final value = results[key];
|
ExpandTile(
|
||||||
return CardX(
|
initiallyExpanded: results.length == 1,
|
||||||
ExpandTile(
|
title: Text(item.dest ?? ''),
|
||||||
initiallyExpanded: results.length == 1,
|
subtitle: Text(item.time.toString(), style: UIs.textGrey),
|
||||||
title: Text(key),
|
children: [
|
||||||
children: [
|
SingleChildScrollView(
|
||||||
Text(
|
padding: const EdgeInsets.symmetric(horizontal: 17),
|
||||||
value ?? '',
|
scrollDirection: Axis.horizontal,
|
||||||
|
child: Text(
|
||||||
|
item.result,
|
||||||
textAlign: TextAlign.start,
|
textAlign: TextAlign.start,
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
),
|
],
|
||||||
);
|
),
|
||||||
},
|
);
|
||||||
),
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,12 +14,10 @@ import 'package:toolbox/data/model/server/dist.dart';
|
|||||||
import 'package:toolbox/data/res/provider.dart';
|
import 'package:toolbox/data/res/provider.dart';
|
||||||
|
|
||||||
import '../../core/route.dart';
|
import '../../core/route.dart';
|
||||||
import '../../core/utils/misc.dart';
|
|
||||||
import '../../core/utils/server.dart';
|
import '../../core/utils/server.dart';
|
||||||
import '../../data/model/app/menu.dart';
|
import '../../data/model/app/menu.dart';
|
||||||
import '../../data/model/pkg/upgrade_info.dart';
|
import '../../data/model/pkg/upgrade_info.dart';
|
||||||
import '../../data/model/server/server_private_info.dart';
|
import '../../data/model/server/server_private_info.dart';
|
||||||
import '../../data/model/server/snippet.dart';
|
|
||||||
import 'popup_menu.dart';
|
import 'popup_menu.dart';
|
||||||
|
|
||||||
class ServerFuncBtnsTopRight extends StatelessWidget {
|
class ServerFuncBtnsTopRight extends StatelessWidget {
|
||||||
@@ -94,28 +92,29 @@ void _onTapMoreBtns(
|
|||||||
check: () => _checkClient(context, spi.id),
|
check: () => _checkClient(context, spi.id),
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case ServerTabMenuType.snippet:
|
// case ServerTabMenuType.snippet:
|
||||||
final snippets = await context.showPickDialog<Snippet>(
|
// final snippets = await context.showPickDialog<Snippet>(
|
||||||
items: Pros.snippet.snippets,
|
// items: Pros.snippet.snippets,
|
||||||
name: (e) => e.name,
|
// name: (e) => e.name,
|
||||||
);
|
// multi: false
|
||||||
if (snippets == null) {
|
// );
|
||||||
return;
|
// if (snippets == null || snippets.isEmpty) {
|
||||||
}
|
// return;
|
||||||
final result = await Pros.server.runSnippets(spi.id, snippets);
|
// }
|
||||||
if (result != null && result.isNotEmpty) {
|
// final result = await Pros.server.runSnippets(spi.id, snippets.first);
|
||||||
context.showRoundDialog(
|
// if (result != null && result.isNotEmpty) {
|
||||||
title: Text(l10n.result),
|
// context.showRoundDialog(
|
||||||
child: Text(result),
|
// title: Text(l10n.result),
|
||||||
actions: [
|
// child: Text(result),
|
||||||
TextButton(
|
// actions: [
|
||||||
onPressed: () => copy2Clipboard(result),
|
// TextButton(
|
||||||
child: Text(l10n.copy),
|
// onPressed: () => copy2Clipboard(result),
|
||||||
)
|
// child: Text(l10n.copy),
|
||||||
],
|
// )
|
||||||
);
|
// ],
|
||||||
}
|
// );
|
||||||
break;
|
// }
|
||||||
|
// break;
|
||||||
case ServerTabMenuType.docker:
|
case ServerTabMenuType.docker:
|
||||||
AppRoute.docker(spi: spi).checkGo(
|
AppRoute.docker(spi: spi).checkGo(
|
||||||
context: context,
|
context: context,
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ class MainFlutterWindow: NSWindow {
|
|||||||
let flutterViewController = FlutterViewController()
|
let flutterViewController = FlutterViewController()
|
||||||
let windowFrame = self.frame
|
let windowFrame = self.frame
|
||||||
self.contentViewController = flutterViewController
|
self.contentViewController = flutterViewController
|
||||||
self.setFrame(windowFrame, display: true)
|
let newWindowRect = NSRect(x: windowFrame.origin.x, y: windowFrame.origin.y, width: 300, height: 600)
|
||||||
|
self.setFrame(newWindowRect, display: true)
|
||||||
|
|
||||||
RegisterGeneratedPlugins(registry: flutterViewController)
|
RegisterGeneratedPlugins(registry: flutterViewController)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user