mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
fix: snippet fmt (#570)
This commit is contained in:
@@ -18,7 +18,7 @@ const backupFormatVersion = 1;
|
|||||||
final _logger = Logger('Backup');
|
final _logger = Logger('Backup');
|
||||||
|
|
||||||
@JsonSerializable()
|
@JsonSerializable()
|
||||||
class Backup extends Mergeable {
|
class Backup implements Mergeable {
|
||||||
// backup format version
|
// backup format version
|
||||||
final int version;
|
final int version;
|
||||||
final String date;
|
final String date;
|
||||||
@@ -28,9 +28,9 @@ class Backup extends Mergeable {
|
|||||||
final Map<String, dynamic> container;
|
final Map<String, dynamic> container;
|
||||||
final Map<String, dynamic> history;
|
final Map<String, dynamic> history;
|
||||||
final int? lastModTime;
|
final int? lastModTime;
|
||||||
final Map<String, dynamic> settings;
|
final Map<String, dynamic>? settings;
|
||||||
|
|
||||||
Backup({
|
const Backup({
|
||||||
required this.version,
|
required this.version,
|
||||||
required this.date,
|
required this.date,
|
||||||
required this.spis,
|
required this.spis,
|
||||||
@@ -181,22 +181,25 @@ class Backup extends Mergeable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
|
final settings_ = settings;
|
||||||
|
if (settings_ != null) {
|
||||||
if (force) {
|
if (force) {
|
||||||
Stores.setting.box.putAll(settings);
|
Stores.setting.box.putAll(settings_);
|
||||||
} else {
|
} else {
|
||||||
final nowSettings = Stores.setting.box.keys.toSet();
|
final nowSettings = Stores.setting.box.keys.toSet();
|
||||||
final bakSettings = settings.keys.toSet();
|
final bakSettings = settings_.keys.toSet();
|
||||||
final newSettings = bakSettings.difference(nowSettings);
|
final newSettings = bakSettings.difference(nowSettings);
|
||||||
final delSettings = nowSettings.difference(bakSettings);
|
final delSettings = nowSettings.difference(bakSettings);
|
||||||
final updateSettings = nowSettings.intersection(bakSettings);
|
final updateSettings = nowSettings.intersection(bakSettings);
|
||||||
for (final s in newSettings) {
|
for (final s in newSettings) {
|
||||||
Stores.setting.box.put(s, settings[s]);
|
Stores.setting.box.put(s, settings_[s]);
|
||||||
}
|
}
|
||||||
for (final s in delSettings) {
|
for (final s in delSettings) {
|
||||||
Stores.setting.box.delete(s);
|
Stores.setting.box.delete(s);
|
||||||
}
|
}
|
||||||
for (final s in updateSettings) {
|
for (final s in updateSettings) {
|
||||||
Stores.setting.box.put(s, settings[s]);
|
Stores.setting.box.put(s, settings_[s]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ Backup _$BackupFromJson(Map<String, dynamic> json) => Backup(
|
|||||||
.toList(),
|
.toList(),
|
||||||
container: json['container'] as Map<String, dynamic>,
|
container: json['container'] as Map<String, dynamic>,
|
||||||
history: json['history'] as Map<String, dynamic>,
|
history: json['history'] as Map<String, dynamic>,
|
||||||
|
settings: json['settings'] as Map<String, dynamic>?,
|
||||||
lastModTime: (json['lastModTime'] as num?)?.toInt(),
|
lastModTime: (json['lastModTime'] as num?)?.toInt(),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -32,4 +33,5 @@ Map<String, dynamic> _$BackupToJson(Backup instance) => <String, dynamic>{
|
|||||||
'container': instance.container,
|
'container': instance.container,
|
||||||
'history': instance.history,
|
'history': instance.history,
|
||||||
'lastModTime': instance.lastModTime,
|
'lastModTime': instance.lastModTime,
|
||||||
|
'settings': instance.settings,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
abstract class TagPickable {
|
|
||||||
bool containsTag(String tag);
|
|
||||||
|
|
||||||
String get tagName;
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:server_box/data/model/app/error.dart';
|
import 'package:server_box/data/model/app/error.dart';
|
||||||
import 'package:server_box/data/model/app/shell_func.dart';
|
import 'package:server_box/data/model/app/shell_func.dart';
|
||||||
import 'package:server_box/data/model/app/tag_pickable.dart';
|
|
||||||
import 'package:server_box/data/model/server/battery.dart';
|
import 'package:server_box/data/model/server/battery.dart';
|
||||||
import 'package:server_box/data/model/server/conn.dart';
|
import 'package:server_box/data/model/server/conn.dart';
|
||||||
import 'package:server_box/data/model/server/cpu.dart';
|
import 'package:server_box/data/model/server/cpu.dart';
|
||||||
@@ -14,7 +13,7 @@ import 'package:server_box/data/model/server/server_private_info.dart';
|
|||||||
import 'package:server_box/data/model/server/system.dart';
|
import 'package:server_box/data/model/server/system.dart';
|
||||||
import 'package:server_box/data/model/server/temp.dart';
|
import 'package:server_box/data/model/server/temp.dart';
|
||||||
|
|
||||||
class Server implements TagPickable {
|
class Server {
|
||||||
Spi spi;
|
Spi spi;
|
||||||
ServerStatus status;
|
ServerStatus status;
|
||||||
SSHClient? client;
|
SSHClient? client;
|
||||||
@@ -27,14 +26,6 @@ class Server implements TagPickable {
|
|||||||
this.client,
|
this.client,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
|
||||||
bool containsTag(String tag) {
|
|
||||||
return spi.tags?.contains(tag) ?? false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get tagName => spi.id;
|
|
||||||
|
|
||||||
bool get needGenClient => conn < ServerConn.connecting;
|
bool get needGenClient => conn < ServerConn.connecting;
|
||||||
|
|
||||||
bool get canViewDetails => conn == ServerConn.finished;
|
bool get canViewDetails => conn == ServerConn.finished;
|
||||||
|
|||||||
@@ -6,13 +6,11 @@ import 'package:json_annotation/json_annotation.dart';
|
|||||||
import 'package:server_box/data/model/server/server_private_info.dart';
|
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||||
import 'package:xterm/core.dart';
|
import 'package:xterm/core.dart';
|
||||||
|
|
||||||
import 'package:server_box/data/model/app/tag_pickable.dart';
|
|
||||||
|
|
||||||
part 'snippet.g.dart';
|
part 'snippet.g.dart';
|
||||||
|
|
||||||
@JsonSerializable()
|
@JsonSerializable()
|
||||||
@HiveType(typeId: 2)
|
@HiveType(typeId: 2)
|
||||||
class Snippet implements TagPickable {
|
class Snippet {
|
||||||
@HiveField(0)
|
@HiveField(0)
|
||||||
final String name;
|
final String name;
|
||||||
@HiveField(1)
|
@HiveField(1)
|
||||||
@@ -39,14 +37,6 @@ class Snippet implements TagPickable {
|
|||||||
|
|
||||||
Map<String, dynamic> toJson() => _$SnippetToJson(this);
|
Map<String, dynamic> toJson() => _$SnippetToJson(this);
|
||||||
|
|
||||||
@override
|
|
||||||
bool containsTag(String tag) {
|
|
||||||
return tags?.contains(tag) ?? false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get tagName => name;
|
|
||||||
|
|
||||||
static final fmtFinder = RegExp(r'\$\{[^{}]+\}');
|
static final fmtFinder = RegExp(r'\$\{[^{}]+\}');
|
||||||
|
|
||||||
String fmtWithSpi(Spi spi) {
|
String fmtWithSpi(Spi spi) {
|
||||||
@@ -109,11 +99,21 @@ class Snippet implements TagPickable {
|
|||||||
if (special != null) {
|
if (special != null) {
|
||||||
final raw = key.substring(special.key.length + 1, key.length - 1);
|
final raw = key.substring(special.key.length + 1, key.length - 1);
|
||||||
await special.value((term: terminal, raw: raw));
|
await special.value((term: terminal, raw: raw));
|
||||||
}
|
} else {
|
||||||
|
|
||||||
// Term keys
|
// Term keys
|
||||||
final termKey = _find(fmtTermKeys, key);
|
final termKey = _find(fmtTermKeys, key);
|
||||||
if (termKey != null) await _doTermKeys(terminal, termKey, key);
|
if (termKey != null) {
|
||||||
|
await _doTermKeys(terminal, termKey, key);
|
||||||
|
} else {
|
||||||
|
// Normal input
|
||||||
|
terminal.textInput(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Text between this and next match
|
||||||
|
if (idx < starts.length - 1) {
|
||||||
|
terminal.textInput(argsFmted.substring(end, starts[idx + 1]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// End term input
|
// End term input
|
||||||
@@ -129,10 +129,10 @@ class Snippet implements TagPickable {
|
|||||||
MapEntry<String, TerminalKey> termKey,
|
MapEntry<String, TerminalKey> termKey,
|
||||||
String key,
|
String key,
|
||||||
) async {
|
) async {
|
||||||
if (termKey.value == TerminalKey.enter) {
|
// if (termKey.value == TerminalKey.enter) {
|
||||||
terminal.keyInput(TerminalKey.enter);
|
// terminal.keyInput(TerminalKey.enter);
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
final ctrlAlt = switch (termKey.value) {
|
final ctrlAlt = switch (termKey.value) {
|
||||||
TerminalKey.control => (ctrl: true, alt: false),
|
TerminalKey.control => (ctrl: true, alt: false),
|
||||||
@@ -140,6 +140,8 @@ class Snippet implements TagPickable {
|
|||||||
_ => (ctrl: false, alt: false),
|
_ => (ctrl: false, alt: false),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (!key.contains('+')) return;
|
||||||
|
|
||||||
// `${ctrl+ad}` -> `ctrla + d`
|
// `${ctrl+ad}` -> `ctrla + d`
|
||||||
final chars = key.substring(termKey.key.length + 1, key.length - 1);
|
final chars = key.substring(termKey.key.length + 1, key.length - 1);
|
||||||
if (chars.isEmpty) return;
|
if (chars.isEmpty) return;
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
|
import 'package:server_box/data/res/build_data.dart';
|
||||||
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
final class NoBackupStore extends PersistentStore {
|
final class NoBackupStore extends PersistentStore {
|
||||||
NoBackupStore._() : super('no_backup');
|
NoBackupStore._() : super('no_backup');
|
||||||
@@ -13,4 +15,35 @@ final class NoBackupStore extends PersistentStore {
|
|||||||
late final webdavUrl = property('webdavUrl', '');
|
late final webdavUrl = property('webdavUrl', '');
|
||||||
late final webdavUser = property('webdavUser', '');
|
late final webdavUser = property('webdavUser', '');
|
||||||
late final webdavPwd = property('webdavPwd', '');
|
late final webdavPwd = property('webdavPwd', '');
|
||||||
|
|
||||||
|
void migrate() {
|
||||||
|
if (BuildData.build > 1076) return;
|
||||||
|
|
||||||
|
final settings = Stores.setting;
|
||||||
|
final icloudSync_ = settings.box.get('icloudSync');
|
||||||
|
if (icloudSync_ is bool) {
|
||||||
|
icloudSync.put(icloudSync_);
|
||||||
|
settings.box.delete('icloudSync');
|
||||||
|
}
|
||||||
|
final webdavSync_ = settings.box.get('webdavSync');
|
||||||
|
if (webdavSync_ is bool) {
|
||||||
|
webdavSync.put(webdavSync_);
|
||||||
|
settings.box.delete('webdavSync');
|
||||||
|
}
|
||||||
|
final webdavUrl_ = settings.box.get('webdavUrl');
|
||||||
|
if (webdavUrl_ is String) {
|
||||||
|
webdavUrl.put(webdavUrl_);
|
||||||
|
settings.box.delete('webdavUrl');
|
||||||
|
}
|
||||||
|
final webdavUser_ = settings.box.get('webdavUser');
|
||||||
|
if (webdavUser_ is String) {
|
||||||
|
webdavUser.put(webdavUser_);
|
||||||
|
settings.box.delete('webdavUser');
|
||||||
|
}
|
||||||
|
final webdavPwd_ = settings.box.get('webdavPwd');
|
||||||
|
if (webdavPwd_ is String) {
|
||||||
|
webdavPwd.put(webdavPwd_);
|
||||||
|
settings.box.delete('webdavPwd');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import 'package:server_box/data/provider/snippet.dart';
|
|||||||
import 'package:server_box/data/res/build_data.dart';
|
import 'package:server_box/data/res/build_data.dart';
|
||||||
import 'package:server_box/data/res/misc.dart';
|
import 'package:server_box/data/res/misc.dart';
|
||||||
import 'package:server_box/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
import 'package:server_box/data/store/no_backup.dart';
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
_runInZone(() async {
|
_runInZone(() async {
|
||||||
await _initApp();
|
await _initApp();
|
||||||
@@ -66,7 +68,6 @@ Future<void> _initApp() async {
|
|||||||
FontUtils.loadFrom(Stores.setting.fontPath.fetch());
|
FontUtils.loadFrom(Stores.setting.fontPath.fetch());
|
||||||
|
|
||||||
_doPlatformRelated();
|
_doPlatformRelated();
|
||||||
_doVersionRelated();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _initData() async {
|
Future<void> _initData() async {
|
||||||
@@ -92,6 +93,9 @@ Future<void> _initData() async {
|
|||||||
SftpProvider.instance.load();
|
SftpProvider.instance.load();
|
||||||
|
|
||||||
if (Stores.setting.betaTest.fetch()) AppUpdate.chan = AppUpdateChan.beta;
|
if (Stores.setting.betaTest.fetch()) AppUpdate.chan = AppUpdateChan.beta;
|
||||||
|
|
||||||
|
// It may effect the following logic, so await it.
|
||||||
|
await _doVersionRelated();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setupDebug() {
|
void _setupDebug() {
|
||||||
@@ -130,6 +134,7 @@ Future<void> _doVersionRelated() async {
|
|||||||
if (curVer < newVer) {
|
if (curVer < newVer) {
|
||||||
ServerDetailCards.autoAddNewCards(newVer);
|
ServerDetailCards.autoAddNewCards(newVer);
|
||||||
ServerFuncBtn.autoAddNewFuncs(newVer);
|
ServerFuncBtn.autoAddNewFuncs(newVer);
|
||||||
|
NoBackupStore.instance.migrate();
|
||||||
Stores.setting.lastVer.put(newVer);
|
Stores.setting.lastVer.put(newVer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user