opt.: confirm of suspend & etc.

This commit is contained in:
lollipopkit
2023-10-05 17:08:21 +08:00
parent 153bfc191d
commit ef144e27cb
20 changed files with 182 additions and 235 deletions

View File

@@ -158,6 +158,12 @@ abstract class S {
/// **'Alter url'**
String get alterUrl;
/// No description provided for @askContinue.
///
/// In en, this message translates to:
/// **'{msg}, continue?'**
String askContinue(Object msg);
/// No description provided for @attention.
///
/// In en, this message translates to:
@@ -368,6 +374,12 @@ abstract class S {
/// **'Batch delete servers'**
String get deleteServers;
/// No description provided for @dirEmpty.
///
/// In en, this message translates to:
/// **'Make sure dir is empty.'**
String get dirEmpty;
/// No description provided for @disabled.
///
/// In en, this message translates to:
@@ -1088,12 +1100,6 @@ abstract class S {
/// **'Restore success. Restart app to apply.'**
String get restoreSuccess;
/// No description provided for @restoreSureWithDate.
///
/// In en, this message translates to:
/// **'Are you sure to restore from {date} ?'**
String restoreSureWithDate(Object date);
/// No description provided for @result.
///
/// In en, this message translates to:
@@ -1268,36 +1274,6 @@ abstract class S {
/// **'Success'**
String get success;
/// No description provided for @sureDelete.
///
/// In en, this message translates to:
/// **'Are you sure to delete [{name}]?'**
String sureDelete(Object name);
/// No description provided for @sureDirEmpty.
///
/// In en, this message translates to:
/// **'Make sure dir is empty.'**
String get sureDirEmpty;
/// No description provided for @sureNoPwd.
///
/// In en, this message translates to:
/// **'Are you sure to use no password?'**
String get sureNoPwd;
/// No description provided for @sureStop.
///
/// In en, this message translates to:
/// **'Sure to stop [{item}] ?'**
String sureStop(Object item);
/// No description provided for @sureToDeleteServer.
///
/// In en, this message translates to:
/// **'Are you sure to delete server [{server}]?'**
String sureToDeleteServer(Object server);
/// No description provided for @suspendTip.
///
/// In en, this message translates to:
@@ -1430,6 +1406,12 @@ abstract class S {
/// **'URL or JSON'**
String get urlOrJson;
/// No description provided for @useNoPwd.
///
/// In en, this message translates to:
/// **'No password will be used.'**
String get useNoPwd;
/// No description provided for @user.
///
/// In en, this message translates to:

View File

@@ -34,6 +34,11 @@ class SDe extends S {
@override
String get alterUrl => 'Url ändern';
@override
String askContinue(Object msg) {
return '$msg, weiter?';
}
@override
String get attention => 'Achtung';
@@ -139,6 +144,9 @@ class SDe extends S {
@override
String get deleteServers => 'Batch-Löschung von Servern';
@override
String get dirEmpty => 'Stelle sicher, dass der Ordner leer ist.';
@override
String get disabled => 'Behinderte';
@@ -523,11 +531,6 @@ class SDe extends S {
@override
String get restoreSuccess => 'Wiederherstellung erfolgreich. App neustarten um Änderungen anzuwenden.';
@override
String restoreSureWithDate(Object date) {
return 'Bist du sicher, dass du das Backup vom $date wiederherstellen möchtest?';
}
@override
String get result => 'Result';
@@ -619,27 +622,6 @@ class SDe extends S {
@override
String get success => 'Erfolgreich';
@override
String sureDelete(Object name) {
return 'Soll [$name] wirklich gelöscht werden?';
}
@override
String get sureDirEmpty => 'Stelle sicher, dass der Ordner leer ist.';
@override
String get sureNoPwd => 'Bist du sicher, dass du kein Passwort verwenden willst?';
@override
String sureStop(Object item) {
return 'Sind Sie sicher, dass Sie [$item] stoppen möchten?';
}
@override
String sureToDeleteServer(Object server) {
return 'Bist du sicher, dass du [$server] löschen willst?';
}
@override
String get suspendTip => 'Die Suspend-Funktion erfordert Root-Rechte und systemd-Unterstützung.';
@@ -710,6 +692,9 @@ class SDe extends S {
@override
String get urlOrJson => 'URL oder JSON';
@override
String get useNoPwd => 'Es wird kein Passwort verwendet.';
@override
String get user => 'Benutzer';

View File

@@ -34,6 +34,11 @@ class SEn extends S {
@override
String get alterUrl => 'Alter url';
@override
String askContinue(Object msg) {
return '$msg, continue?';
}
@override
String get attention => 'Attention';
@@ -139,6 +144,9 @@ class SEn extends S {
@override
String get deleteServers => 'Batch delete servers';
@override
String get dirEmpty => 'Make sure dir is empty.';
@override
String get disabled => 'Disabled';
@@ -523,11 +531,6 @@ class SEn extends S {
@override
String get restoreSuccess => 'Restore success. Restart app to apply.';
@override
String restoreSureWithDate(Object date) {
return 'Are you sure to restore from $date ?';
}
@override
String get result => 'Result';
@@ -619,27 +622,6 @@ class SEn extends S {
@override
String get success => 'Success';
@override
String sureDelete(Object name) {
return 'Are you sure to delete [$name]?';
}
@override
String get sureDirEmpty => 'Make sure dir is empty.';
@override
String get sureNoPwd => 'Are you sure to use no password?';
@override
String sureStop(Object item) {
return 'Sure to stop [$item] ?';
}
@override
String sureToDeleteServer(Object server) {
return 'Are you sure to delete server [$server]?';
}
@override
String get suspendTip => 'The suspend function requires root privileges and systemd support.';
@@ -710,6 +692,9 @@ class SEn extends S {
@override
String get urlOrJson => 'URL or JSON';
@override
String get useNoPwd => 'No password will be used.';
@override
String get user => 'User';

View File

@@ -34,6 +34,11 @@ class SId extends S {
@override
String get alterUrl => 'Alter url';
@override
String askContinue(Object msg) {
return '$msg, lanjutkan?';
}
@override
String get attention => 'Perhatian';
@@ -139,6 +144,9 @@ class SId extends S {
@override
String get deleteServers => 'Penghapusan server secara batch';
@override
String get dirEmpty => 'Pastikan dir kosong.';
@override
String get disabled => 'Dengan disabilitas';
@@ -523,11 +531,6 @@ class SId extends S {
@override
String get restoreSuccess => 'Kembalikan kesuksesan. Mulai ulang aplikasi untuk diterapkan.';
@override
String restoreSureWithDate(Object date) {
return 'Apakah Anda pasti akan memulihkan dari $date?';
}
@override
String get result => 'Hasil';
@@ -619,27 +622,6 @@ class SId extends S {
@override
String get success => 'Kesuksesan';
@override
String sureDelete(Object name) {
return 'Apakah Anda pasti akan menghapus [$name]?';
}
@override
String get sureDirEmpty => 'Pastikan dir kosong.';
@override
String get sureNoPwd => 'Apakah Anda pasti tidak menggunakan kata sandi?';
@override
String sureStop(Object item) {
return 'Anda yakin ingin menghentikan [$item]?';
}
@override
String sureToDeleteServer(Object server) {
return 'Apakah Anda pasti akan menghapus server [$server]?';
}
@override
String get suspendTip => 'Fungsi penangguhan memerlukan hak akses root dan dukungan systemd.';
@@ -710,6 +692,9 @@ class SId extends S {
@override
String get urlOrJson => 'URL atau JSON';
@override
String get useNoPwd => 'Tidak ada kata sandi yang akan digunakan.';
@override
String get user => 'Username';

View File

@@ -34,6 +34,11 @@ class SZh extends S {
@override
String get alterUrl => '备选链接';
@override
String askContinue(Object msg) {
return '$msg,继续吗?';
}
@override
String get attention => '注意';
@@ -139,6 +144,9 @@ class SZh extends S {
@override
String get deleteServers => '批量删除服务器';
@override
String get dirEmpty => '请确保文件夹为空';
@override
String get disabled => '已禁用';
@@ -523,11 +531,6 @@ class SZh extends S {
@override
String get restoreSuccess => '恢复成功需要重启App来应用更改';
@override
String restoreSureWithDate(Object date) {
return '确定恢复 $date 的备份吗?';
}
@override
String get result => '结果';
@@ -619,27 +622,6 @@ class SZh extends S {
@override
String get success => '成功';
@override
String sureDelete(Object name) {
return '确定删除 [$name]';
}
@override
String get sureDirEmpty => '请确保文件夹为空';
@override
String get sureNoPwd => '确认使用无密码?';
@override
String sureStop(Object item) {
return '确定要停止 [$item] 吗?';
}
@override
String sureToDeleteServer(Object server) {
return '你确定要删除服务器 [$server] 吗?';
}
@override
String get suspendTip => 'suspend 功能需要 root 权限及 systemd 支持。';
@@ -710,6 +692,9 @@ class SZh extends S {
@override
String get urlOrJson => '链接或JSON';
@override
String get useNoPwd => '将会使用无密码。';
@override
String get user => '用户';
@@ -784,6 +769,11 @@ class SZhTw extends SZh {
@override
String get alterUrl => '備選鏈接';
@override
String askContinue(Object msg) {
return '$msg,繼續嗎?';
}
@override
String get attention => '注意';
@@ -889,6 +879,9 @@ class SZhTw extends SZh {
@override
String get deleteServers => '批量刪除服務器';
@override
String get dirEmpty => '請確保文件夾為空';
@override
String get disabled => '已禁用';
@@ -1273,11 +1266,6 @@ class SZhTw extends SZh {
@override
String get restoreSuccess => '恢復成功需要重啓App來應用更改';
@override
String restoreSureWithDate(Object date) {
return '確定恢復 $date 的備份嗎?';
}
@override
String get result => '結果';
@@ -1369,27 +1357,6 @@ class SZhTw extends SZh {
@override
String get success => '成功';
@override
String sureDelete(Object name) {
return '確定刪除 [$name]';
}
@override
String get sureDirEmpty => '請確保文件夾為空';
@override
String get sureNoPwd => '確認使用無密碼?';
@override
String sureStop(Object item) {
return '確定要停止 [$item] 嗎?';
}
@override
String sureToDeleteServer(Object server) {
return '你確定要刪除服務器 [$server] 嗎?';
}
@override
String get suspendTip => 'suspend 功能需要 root 權限及 systemd 支持。';
@@ -1460,6 +1427,9 @@ class SZhTw extends SZh {
@override
String get urlOrJson => '鏈接或JSON';
@override
String get useNoPwd => '将使用無密碼。';
@override
String get user => '用戶';

View File

@@ -10,6 +10,7 @@
"all": "Alle",
"alreadyLastDir": "Bereits im letzten Verzeichnis.",
"alterUrl": "Url ändern",
"askContinue": "{msg}, weiter?",
"attention": "Achtung",
"authRequired": "Autorisierung erforderlich",
"auto": "System folgen",
@@ -45,6 +46,7 @@
"decompress": "Dekomprimieren",
"delete": "Löschen",
"deleteServers": "Batch-Löschung von Servern",
"dirEmpty": "Stelle sicher, dass der Ordner leer ist.",
"disabled": "Behinderte",
"disconnected": "Disconnected",
"diskIgnorePath": "Pfad für Datenträger ignorieren",
@@ -165,7 +167,6 @@
"restart": "Neustart",
"restore": "Wiederherstellen",
"restoreSuccess": "Wiederherstellung erfolgreich. App neustarten um Änderungen anzuwenden.",
"restoreSureWithDate": "Bist du sicher, dass du das Backup vom {date} wiederherstellen möchtest?",
"result": "Result",
"rotateAngel": "Rotationswinkel",
"run": "Ausführen",
@@ -195,11 +196,6 @@
"stats": "Statistik",
"stop": "Stop",
"success": "Erfolgreich",
"sureDelete": "Soll [{name}] wirklich gelöscht werden?",
"sureDirEmpty": "Stelle sicher, dass der Ordner leer ist.",
"sureNoPwd": "Bist du sicher, dass du kein Passwort verwenden willst?",
"sureStop": "Sind Sie sicher, dass Sie [{item}] stoppen möchten?",
"sureToDeleteServer": "Bist du sicher, dass du [{server}] löschen willst?",
"suspendTip": "Die Suspend-Funktion erfordert Root-Rechte und systemd-Unterstützung.",
"syncTip": "Nach der automatischen Synchronisierung kann es erforderlich sein, die App neu zu starten, damit bestimmte Änderungen wirksam werden.",
"system": "Systeme",
@@ -222,6 +218,7 @@
"upload": "Hochladen",
"upsideDown": "Upside Down",
"urlOrJson": "URL oder JSON",
"useNoPwd": "Es wird kein Passwort verwendet.",
"user": "Benutzer",
"versionHaveUpdate": "Gefunden: v1.0.{build}, klicke zum Aktualisieren",
"versionUnknownUpdate": "Aktuell: v1.0.{build}. Klicken Sie hier, um nach Updates zu suchen",

View File

@@ -10,6 +10,7 @@
"all": "All",
"alreadyLastDir": "Already in last directory.",
"alterUrl": "Alter url",
"askContinue": "{msg}, continue?",
"attention": "Attention",
"authRequired": "Auth required",
"auto": "Auto",
@@ -45,6 +46,7 @@
"decompress": "Decompress",
"delete": "Delete",
"deleteServers": "Batch delete servers",
"dirEmpty": "Make sure dir is empty.",
"disabled": "Disabled",
"disconnected": "Disconnected",
"diskIgnorePath": "Ignore path for disk",
@@ -165,7 +167,6 @@
"restart": "Restart",
"restore": "Restore",
"restoreSuccess": "Restore success. Restart app to apply.",
"restoreSureWithDate": "Are you sure to restore from {date} ?",
"result": "Result",
"rotateAngel": "Rotation angle",
"run": "Run",
@@ -195,11 +196,6 @@
"stats": "Stats",
"stop": "Stop",
"success": "Success",
"sureDelete": "Are you sure to delete [{name}]?",
"sureDirEmpty": "Make sure dir is empty.",
"sureNoPwd": "Are you sure to use no password?",
"sureStop": "Sure to stop [{item}] ?",
"sureToDeleteServer": "Are you sure to delete server [{server}]?",
"suspendTip": "The suspend function requires root privileges and systemd support.",
"syncTip": "After auto sync, a restart may be required for some changes to take effect.",
"system": "System",
@@ -222,6 +218,7 @@
"upload": "Upload",
"upsideDown": "Upside Down",
"urlOrJson": "URL or JSON",
"useNoPwd": "No password will be used.",
"user": "User",
"versionHaveUpdate": "Found: v1.0.{build}, click to update",
"versionUnknownUpdate": "Current: v1.0.{build}, click to check updates",

View File

@@ -10,6 +10,7 @@
"all": "Semua",
"alreadyLastDir": "Sudah di direktori terakhir.",
"alterUrl": "Alter url",
"askContinue": "{msg}, lanjutkan?",
"attention": "Perhatian",
"authRequired": "Auth diperlukan",
"auto": "Auto",
@@ -45,6 +46,7 @@
"decompress": "Dekompresi",
"delete": "Menghapus",
"deleteServers": "Penghapusan server secara batch",
"dirEmpty": "Pastikan dir kosong.",
"disabled": "Dengan disabilitas",
"disconnected": "Terputus",
"diskIgnorePath": "Abaikan jalan untuk disk",
@@ -165,7 +167,6 @@
"restart": "Mengulang kembali",
"restore": "Memulihkan",
"restoreSuccess": "Kembalikan kesuksesan. Mulai ulang aplikasi untuk diterapkan.",
"restoreSureWithDate": "Apakah Anda pasti akan memulihkan dari {date}?",
"result": "Hasil",
"rotateAngel": "Sudut rotasi",
"run": "Berlari",
@@ -195,11 +196,6 @@
"stats": "Statistik",
"stop": "Berhenti",
"success": "Kesuksesan",
"sureDelete": "Apakah Anda pasti akan menghapus [{name}]?",
"sureDirEmpty": "Pastikan dir kosong.",
"sureNoPwd": "Apakah Anda pasti tidak menggunakan kata sandi?",
"sureStop": "Anda yakin ingin menghentikan [{item}]?",
"sureToDeleteServer": "Apakah Anda pasti akan menghapus server [{server}]?",
"suspendTip": "Fungsi penangguhan memerlukan hak akses root dan dukungan systemd.",
"syncTip": "Setelah sinkronisasi otomatis, mungkin perlu memulai ulang aplikasi agar perubahan tertentu dapat diterapkan.",
"system": "Sistem",
@@ -222,6 +218,7 @@
"upload": "Mengunggah",
"upsideDown": "Terbalik",
"urlOrJson": "URL atau JSON",
"useNoPwd": "Tidak ada kata sandi yang akan digunakan.",
"user": "Username",
"versionHaveUpdate": "Ditemukan: v1.0.{build}, klik untuk memperbarui",
"versionUnknownUpdate": "Saat ini: v1.0.{build}. Klik untuk memeriksa pembaruan.",

View File

@@ -10,6 +10,7 @@
"all": "所有",
"alreadyLastDir": "已经是最上层目录了",
"alterUrl": "备选链接",
"askContinue": "{msg},继续吗?",
"attention": "注意",
"authRequired": "需要认证",
"auto": "自动",
@@ -45,6 +46,7 @@
"decompress": "解压缩",
"delete": "删除",
"deleteServers": "批量删除服务器",
"dirEmpty": "请确保文件夹为空",
"disabled": "已禁用",
"disconnected": "连接断开",
"diskIgnorePath": "忽略的磁盘路径",
@@ -165,7 +167,6 @@
"restart": "重启",
"restore": "恢复",
"restoreSuccess": "恢复成功需要重启App来应用更改",
"restoreSureWithDate": "确定恢复 {date} 的备份吗?",
"result": "结果",
"rotateAngel": "旋转角度",
"run": "运行",
@@ -195,11 +196,6 @@
"stats": "统计",
"stop": "停止",
"success": "成功",
"sureDelete": "确定删除 [{name}]",
"sureDirEmpty": "请确保文件夹为空",
"sureNoPwd": "确认使用无密码?",
"sureStop": "确定要停止 [{item}] 吗?",
"sureToDeleteServer": "你确定要删除服务器 [{server}] 吗?",
"suspendTip": "suspend 功能需要 root 权限及 systemd 支持。",
"syncTip": "在自动同步后,可能需要重新启动,某些更改才能生效。",
"system": "系统",
@@ -222,6 +218,7 @@
"upload": "上传",
"upsideDown": "上下交换",
"urlOrJson": "链接或JSON",
"useNoPwd": "将会使用无密码。",
"user": "用户",
"versionHaveUpdate": "找到新版本v1.0.{build}, 点击更新",
"versionUnknownUpdate": "当前v1.0.{build},点击检查更新",

View File

@@ -10,6 +10,7 @@
"all": "所有",
"alreadyLastDir": "已經是最上層目錄了",
"alterUrl": "備選鏈接",
"askContinue": "{msg},繼續嗎?",
"attention": "注意",
"authRequired": "需要認證",
"auto": "自動",
@@ -45,6 +46,7 @@
"decompress": "解壓縮",
"delete": "刪除",
"deleteServers": "批量刪除服務器",
"dirEmpty": "請確保文件夾為空",
"disabled": "已禁用",
"disconnected": "連接斷開",
"diskIgnorePath": "忽略的磁盤路徑",
@@ -165,7 +167,6 @@
"restart": "重啓",
"restore": "恢復",
"restoreSuccess": "恢復成功需要重啓App來應用更改",
"restoreSureWithDate": "確定恢復 {date} 的備份嗎?",
"result": "結果",
"rotateAngel": "旋轉角度",
"run": "運行",
@@ -195,11 +196,6 @@
"stats": "統計",
"stop": "停止",
"success": "成功",
"sureDelete": "確定刪除 [{name}]",
"sureDirEmpty": "請確保文件夾為空",
"sureNoPwd": "確認使用無密碼?",
"sureStop": "確定要停止 [{item}] 嗎?",
"sureToDeleteServer": "你確定要刪除服務器 [{server}] 嗎?",
"suspendTip": "suspend 功能需要 root 權限及 systemd 支持。",
"syncTip": "在自動同步後,可能需要重新啟動,某些更改才能生效。",
"system": "系統",
@@ -222,6 +218,7 @@
"upload": "上傳",
"upsideDown": "上下交換",
"urlOrJson": "鏈接或JSON",
"useNoPwd": "将使用無密碼。",
"user": "用戶",
"versionHaveUpdate": "找到新版本v1.0.{build}, 點擊更新",
"versionUnknownUpdate": "當前v1.0.{build},點擊檢查更新",

View File

@@ -153,7 +153,9 @@ class BackupPage extends StatelessWidget {
await context.showRoundDialog(
title: Text(l10n.restore),
child: Text(l10n.restoreSureWithDate(backup.date)),
child: Text(l10n.askContinue(
'${l10n.restore} ${l10n.backup}(${backup.date})',
)),
actions: [
TextButton(
onPressed: () => context.pop(),

View File

@@ -249,7 +249,7 @@ class _DockerManagePageState extends State<DockerManagePage> {
void _showImageRmDialog(DockerImage e) {
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.sureDelete(e.repo)),
child: Text(l10n.askContinue('${l10n.delete} Image(${e.repo})')),
actions: [
TextButton(
onPressed: () => context.pop(),
@@ -365,7 +365,9 @@ class _DockerManagePageState extends State<DockerManagePage> {
case DockerMenuType.rm:
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.sureDelete(dItem.name)),
child: Text(l10n.askContinue(
'${l10n.delete} Container(${dItem.name})',
)),
actions: [
TextButton(
onPressed: () async {

View File

@@ -91,7 +91,9 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
onPressed: () {
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.sureDelete(widget.pki!.id)),
child: Text(l10n.askContinue(
'${l10n.delete} ${l10n.privateKey}(${widget.pki!.id})',
)),
actions: [
TextButton(
onPressed: () {

View File

@@ -160,7 +160,9 @@ class _ProcessPageState extends State<ProcessPage> {
onLongPress: () {
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.sureStop(proc.pid)),
child: Text(l10n.askContinue(
'${l10n.stop} ${l10n.process}(${proc.pid})',
)),
actions: [
TextButton(
onPressed: () async {

View File

@@ -111,7 +111,9 @@ class _ServerEditPageState extends State<ServerEditPage> {
onPressed: () {
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.sureToDeleteServer(widget.spi!.name)),
child: Text(l10n.askContinue(
'${l10n.delete} ${l10n.server}(${widget.spi!.name})',
)),
actions: [
TextButton(
onPressed: () {
@@ -315,14 +317,14 @@ class _ServerEditPageState extends State<ServerEditPage> {
}
void _onSave() async {
if (_ipController.text == '') {
if (_ipController.text.isEmpty) {
context.showSnackBar(l10n.plzEnterHost);
return;
}
if (_keyIdx.value == null && _passwordController.text == '') {
if (_keyIdx.value == null && _passwordController.text.isEmpty) {
final cancel = await context.showRoundDialog<bool>(
title: Text(l10n.attention),
child: Text(l10n.sureNoPwd),
child: Text(l10n.askContinue(l10n.useNoPwd)),
actions: [
TextButton(
onPressed: () => context.pop(false),

View File

@@ -3,6 +3,7 @@ import 'package:circle_chart/circle_chart.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart';
import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/extension/media_queryx.dart';
@@ -244,7 +245,8 @@ class _ServerPageState extends State<ServerPage>
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
IconButton(
onPressed: () async {
onPressed: () => _askFor(
func: () async {
if (Stores.first.showSuspendTip.fetch()) {
await context.showRoundDialog(
title: Text(l10n.attention),
@@ -257,22 +259,24 @@ class _ServerPageState extends State<ServerPage>
context: context,
);
},
msg: 'Suspend ${srv.spi.name}',
),
icon: const Icon(Icons.stop),
tooltip: 'Suspend',
),
IconButton(
onPressed: () => srv.client?.execWithPwd(
onPressed: () => _askFor(func: () => srv.client?.execWithPwd(
ShellFunc.shutdown.exec,
context: context,
),
), msg: 'Shutdown ${srv.spi.name}',),
icon: const Icon(Icons.power_off),
tooltip: 'Shutdown',
),
IconButton(
onPressed: () => srv.client?.execWithPwd(
onPressed: () => _askFor(func: () => srv.client?.execWithPwd(
ShellFunc.reboot.exec,
context: context,
),
), msg: 'Reboot ${srv.spi.name}',),
icon: const Icon(Icons.restart_alt),
tooltip: 'Reboot',
),
@@ -531,4 +535,20 @@ class _ServerPageState extends State<ServerPage>
}
return 107;
}
void _askFor({required void Function() func, required String msg}) {
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.askContinue(msg)),
actions: [
TextButton(
onPressed: () {
context.pop();
func();
},
child: Text(l10n.ok),
),
],
);
}
}

View File

@@ -105,7 +105,9 @@ class _SettingPageState extends State<SettingPage> {
child: InkWell(
onTap: () => context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.sureDelete(l10n.all)),
child: Text(l10n.askContinue(
'${l10n.delete}: **${l10n.all}** ${l10n.setting}',
)),
actions: [
TextButton(
onPressed: () {
@@ -113,8 +115,10 @@ class _SettingPageState extends State<SettingPage> {
context.pop();
context.showSnackBar(l10n.success);
},
child: Text(l10n.ok,
style: const TextStyle(color: Colors.red)),
child: Text(
l10n.ok,
style: const TextStyle(color: Colors.red),
),
),
],
),
@@ -880,7 +884,9 @@ class _SettingPageState extends State<SettingPage> {
(e) => TextButton(
onPressed: () => context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.sureDelete(e)),
child: Text(l10n.askContinue(
'${l10n.delete} ${l10n.server}($e)',
)),
actions: [
TextButton(
onPressed: () => Pros.server.delServer(e),

View File

@@ -1,6 +1,7 @@
import 'package:after_layout/after_layout.dart';
import 'package:flutter/material.dart';
import 'package:toolbox/core/extension/context/common.dart';
import 'package:toolbox/core/extension/context/dialog.dart';
import 'package:toolbox/core/extension/context/locale.dart';
import 'package:toolbox/core/extension/context/snackbar.dart';
import 'package:toolbox/data/res/provider.dart';
@@ -55,9 +56,23 @@ class _SnippetEditPageState extends State<SnippetEditPage>
}
return [
IconButton(
onPressed: () {
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.askContinue(
'${l10n.delete} ${l10n.snippet}(${widget.snippet!.name})',
)),
actions: [
TextButton(
onPressed: () {
Pros.snippet.del(widget.snippet!);
context.pop();
context.pop();
},
child: Text(l10n.ok, style: UIs.textRed),
),
],
);
},
tooltip: l10n.delete,
icon: const Icon(Icons.delete),

View File

@@ -410,8 +410,9 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
context.pop();
final isDir = file.attr.isDirectory;
final useRmrf = Stores.setting.sftpRmrfDir.fetch();
final dirText = (isDir && !useRmrf) ? '\n${l10n.sureDirEmpty}' : '';
final text = '${l10n.sureDelete(file.filename)}$dirText';
final dirText = (isDir && !useRmrf) ? '\n${l10n.dirEmpty}' : '';
final text = l10n.askContinue(
'${l10n.delete} ${l10n.files}(${file.filename})\n$dirText');
final child = Text(text);
context.showRoundDialog(
child: child,
@@ -475,7 +476,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
),
TextButton(
onPressed: () async {
if (textController.text == '') {
if (textController.text.isEmpty) {
context.showRoundDialog(
child: Text(l10n.fieldMustNotEmpty),
actions: [
@@ -512,7 +513,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
actions: [
TextButton(
onPressed: () async {
if (textController.text == '') {
if (textController.text.isEmpty) {
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.fieldMustNotEmpty),
@@ -553,7 +554,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
TextButton(onPressed: () => context.pop(), child: Text(l10n.cancel)),
TextButton(
onPressed: () async {
if (textController.text == '') {
if (textController.text.isEmpty) {
context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.fieldMustNotEmpty),
@@ -566,7 +567,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
);
return;
}
await _status.client!.rename(file.filename, textController.text);
await _status.client?.rename(file.filename, textController.text);
context.pop();
_listDir();
},
@@ -610,7 +611,8 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
/// Only return true if the path is changed
Future<bool> _listDir() async {
context.showLoadingDialog();
// Allow dismiss, because may this op will take a long time
context.showLoadingDialog(barrierDismiss: true);
if (_status.client == null) {
final sftpc = await _client?.sftp();
_status.client = sftpc;

View File

@@ -137,7 +137,9 @@ class _SftpMissionPageState extends State<SftpMissionPage> {
return IconButton(
onPressed: () => context.showRoundDialog(
title: Text(l10n.attention),
child: Text(l10n.sureDelete(name)),
child: Text(l10n.askContinue(
'${l10n.delete} ${l10n.mission}($name)',
)),
actions: [
TextButton(
onPressed: () {