From 76e98c6468c3726bfda592c6c169e7558feb5c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lollipopkit=F0=9F=8F=B3=EF=B8=8F=E2=80=8D=E2=9A=A7?= =?UTF-8?q?=EF=B8=8F?= <10864310+lollipopkit@users.noreply.github.com> Date: Sat, 17 Aug 2024 22:44:35 +0800 Subject: [PATCH] feat: custom shell script install path (#545) --- ios/Runner.xcodeproj/project.pbxproj | 36 ++-- lib/data/model/app/net_view.dart | 2 +- lib/data/model/app/shell_func.dart | 4 + lib/data/res/build_data.dart | 2 +- lib/l10n/app_de.arb | 2 + lib/l10n/app_en.arb | 2 + lib/l10n/app_es.arb | 2 + lib/l10n/app_fr.arb | 2 + lib/l10n/app_id.arb | 2 + lib/l10n/app_ja.arb | 2 + lib/l10n/app_nl.arb | 2 + lib/l10n/app_pt.arb | 2 + lib/l10n/app_ru.arb | 2 + lib/l10n/app_tr.arb | 2 + lib/l10n/app_zh.arb | 2 + lib/l10n/app_zh_tw.arb | 2 + lib/view/page/server/edit.dart | 239 +++++++++++++++---------- lib/view/page/server/tab.dart | 2 +- macos/Runner.xcodeproj/project.pbxproj | 12 +- pubspec.yaml | 2 +- 20 files changed, 199 insertions(+), 124 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index dfd251df..10b73296 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -690,7 +690,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -700,7 +700,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -826,7 +826,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -836,7 +836,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -854,7 +854,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -864,7 +864,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -885,7 +885,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -898,7 +898,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -924,7 +924,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -937,7 +937,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -960,7 +960,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -973,7 +973,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -996,7 +996,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1008,7 +1008,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -1037,7 +1037,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1049,7 +1049,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -1075,7 +1075,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1087,7 +1087,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/data/model/app/net_view.dart b/lib/data/model/app/net_view.dart index cb8774c7..3e783201 100644 --- a/lib/data/model/app/net_view.dart +++ b/lib/data/model/app/net_view.dart @@ -26,7 +26,7 @@ enum NetViewType { NetViewType.speed => l10n.speed, }; - /// If no device is specified, return the cached value (only real devices, + /// If no device is specified, return the cached value (only real devices, /// such as ethX, wlanX...). (String, String) build(ServerStatus ss, {String? dev}) { final notSepcifyDev = dev == null || dev.isEmpty; diff --git a/lib/data/model/app/shell_func.dart b/lib/data/model/app/shell_func.dart index 4592fe72..f95e34e9 100644 --- a/lib/data/model/app/shell_func.dart +++ b/lib/data/model/app/shell_func.dart @@ -1,4 +1,5 @@ import 'package:server_box/core/extension/context/locale.dart'; +import 'package:server_box/data/provider/server.dart'; import 'package:server_box/data/res/build_data.dart'; import 'package:server_box/data/model/server/system.dart'; @@ -29,6 +30,9 @@ enum ShellFunc { /// Default is [scriptDirTmp]/[scriptFile], if this path is not accessible, /// it will be changed to [scriptDirHome]/[scriptFile]. static String getScriptDir(String id) { + final customScriptDir = + ServerProvider.pick(id: id)?.value.spi.custom?.scriptDir; + if (customScriptDir != null) return customScriptDir; return _scriptDirMap.putIfAbsent(id, () { return scriptDirTmp; }); diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index b3c4348d..7184fd37 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -3,6 +3,6 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 1068; + static const int build = 1069; static const int script = 57; } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 929aa143..9f570f05 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -161,6 +161,8 @@ "size": "Größe", "snippet": "Snippet", "softWrap": "Weicher Umbruch", + "specifyDev": "Gerät angeben", + "specifyDevTip": "Zum Beispiel bezieht sich die Standard-Netzwerkverkehrsstatistik auf alle Geräte. Hier können Sie ein bestimmtes Gerät angeben.", "speed": "Tempo", "spentTime": "Benötigte Zeit: {time}", "sshTermHelp": "Wenn das Terminal scrollbar ist, kann durch horizontales Ziehen Text ausgewählt werden. Durch Klicken auf die Tastentaste wird die Tastatur ein- oder ausgeschaltet. Das Dateisymbol öffnet den aktuellen Pfad SFTP. Die Zwischenablage-Schaltfläche kopiert den Inhalt, wenn Text ausgewählt ist, und fügt Inhalte aus der Zwischenablage in das Terminal ein, wenn kein Text ausgewählt ist und Inhalte in der Zwischenablage vorhanden sind. Das Codesymbol fügt Code-Schnipsel ins Terminal ein und führt sie aus.", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b6da932c..a681ac67 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -161,6 +161,8 @@ "size": "Size", "snippet": "Snippet", "softWrap": "Soft wrap", + "specifyDev": "Specify device", + "specifyDevTip": "For example, network traffic statistics are by default for all devices. You can specify a particular device here.", "speed": "Speed", "spentTime": "Spent time: {time}", "sshTermHelp": "When the terminal is scrollable, dragging horizontally can select text. Clicking the keyboard button turns the keyboard on/off. The file icon opens the current path SFTP. The clipboard button copies the content when text is selected, and pastes content from the clipboard into the terminal when no text is selected and there is content on the clipboard. The code icon pastes code snippets into the terminal and executes them.", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 1bb7db65..7e3ca039 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -161,6 +161,8 @@ "size": "Tamaño", "snippet": "Fragmento de código", "softWrap": "Salto de línea suave", + "specifyDev": "Especificar dispositivo", + "specifyDevTip": "Por ejemplo, las estadísticas de tráfico de red son por defecto para todos los dispositivos. Aquí puede especificar un dispositivo en particular.", "speed": "Velocidad", "spentTime": "Tiempo gastado: {time}", "sshTermHelp": "Cuando el terminal es desplazable, arrastrar horizontalmente puede seleccionar texto. Hacer clic en el botón del teclado enciende/apaga el teclado. El icono de archivo abre el SFTP de la ruta actual. El botón del portapapeles copia el contenido cuando se selecciona texto y pega el contenido del portapapeles en el terminal cuando no se selecciona texto y hay contenido en el portapapeles. El icono de código pega fragmentos de código en el terminal y los ejecuta.", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index bc145bad..e6960760 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -161,6 +161,8 @@ "size": "Taille", "snippet": "Extrait", "softWrap": "Retour à la ligne souple", + "specifyDev": "Spécifier l'appareil", + "specifyDevTip": "Par exemple, les statistiques de trafic réseau concernent par défaut tous les appareils. Vous pouvez spécifier ici un appareil particulier.", "speed": "Vitesse", "spentTime": "Temps écoulé : {time}", "sshTermHelp": "Lorsque le terminal est défilable, faire glisser horizontalement permet de sélectionner du texte. En cliquant sur le bouton du clavier, vous activez/désactivez le clavier. L'icône de fichier ouvre le chemin actuel SFTP. Le bouton du presse-papiers copie le contenu lorsque du texte est sélectionné, et colle le contenu du presse-papiers dans le terminal lorsqu'aucun texte n'est sélectionné et qu'il y a du contenu dans le presse-papiers. L'icône de code colle des extraits de code dans le terminal et les exécute.", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 4d384e48..ffcfff3f 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -161,6 +161,8 @@ "size": "Ukuran", "snippet": "Snippet", "softWrap": "Pembungkus lembut", + "specifyDev": "Tentukan perangkat", + "specifyDevTip": "Misalnya, statistik lalu lintas jaringan secara default adalah untuk semua perangkat. Anda dapat menentukan perangkat tertentu di sini.", "speed": "Kecepatan", "spentTime": "Menghabiskan waktu: {time}", "sshTermHelp": "Ketika terminal dapat digulirkan, menggeser secara horizontal dapat memilih teks. Mengklik tombol keyboard mengaktifkan/menonaktifkan keyboard. Ikon file membuka SFTP jalur saat ini. Tombol papan klip menyalin konten saat teks dipilih, dan menempelkan konten dari papan klip ke terminal saat tidak ada teks yang dipilih dan ada konten di papan klip. Ikon kode menempelkan potongan kode ke terminal dan mengeksekusinya.", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 0a644cbb..e536e1b3 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -161,6 +161,8 @@ "size": "サイズ", "snippet": "スニペット", "softWrap": "ソフトラップ", + "specifyDev": "デバイスを指定", + "specifyDevTip": "例えば、ネットワークトラフィック統計はデフォルトですべてのデバイスに対するものです。ここで特定のデバイスを指定できます。", "speed": "速度", "spentTime": "時間を費やしました: {time}", "sshTermHelp": "ターミナルがスクロール可能な場合、横にドラッグするとテキストを選択できます。キーボードボタンをクリックするとキーボードのオン/オフが切り替わります。ファイルアイコンは現在のパスSFTPを開きます。クリップボードボタンは、テキストが選択されているときに内容をコピーし、テキストが選択されておらずクリップボードに内容がある場合には、その内容をターミナルに貼り付けます。コードアイコンは、コードスニペットをターミナルに貼り付けて実行します。", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 1a547dbf..aacc214b 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -161,6 +161,8 @@ "size": "Grootte", "snippet": "Fragment", "softWrap": "Zachte wrap", + "specifyDev": "Apparaat specificeren", + "specifyDevTip": "Bijvoorbeeld, netwerkverkeersstatistieken zijn standaard voor alle apparaten. Hier kunt u een specifiek apparaat opgeven.", "speed": "Snelheid", "spentTime": "Gebruikte tijd: {time}", "sshTermHelp": "Wanneer het terminal scrollbaar is, kan horizontaal slepen tekst selecteren. Klikken op de toetsenbordknop schakelt het toetsenbord aan/uit. Het bestandsicoon opent de huidige pad SFTP. De klembordknop kopieert de inhoud wanneer tekst is geselecteerd en plakt inhoud van het klembord in de terminal wanneer geen tekst is geselecteerd en er inhoud op het klembord staat. Het code-icoon plakt codefragmenten in de terminal en voert ze uit.", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 4ee0424d..b169f0cf 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -161,6 +161,8 @@ "size": "Tamanho", "snippet": "Snippet", "softWrap": "Quebra de linha suave", + "specifyDev": "Especificar dispositivo", + "specifyDevTip": "Por exemplo, as estatísticas de tráfego de rede são por padrão para todos os dispositivos. Você pode especificar um dispositivo específico aqui.", "speed": "Velocidade", "spentTime": "Tempo gasto: {time}", "sshTermHelp": "Quando o terminal é rolável, arrastar horizontalmente pode selecionar texto. Clicar no botão do teclado ativa/desativa o teclado. O ícone de arquivo abre o SFTP do caminho atual. O botão da área de transferência copia o conteúdo quando o texto é selecionado e cola o conteúdo da área de transferência no terminal quando nenhum texto é selecionado e há conteúdo na área de transferência. O ícone de código cola trechos de código no terminal e os executa.", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index d0c4d7ce..98a5d125 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -161,6 +161,8 @@ "size": "размер", "snippet": "фрагмент", "softWrap": "Мягкий перенос", + "specifyDev": "Указать устройство", + "specifyDevTip": "Например, статистика сетевого трафика по умолчанию относится ко всем устройствам. Здесь вы можете указать конкретное устройство.", "speed": "скорость", "spentTime": "Затрачено времени: {time}", "sshTermHelp": "Когда терминал можно прокручивать, горизонтальное перетаскивание позволяет выделить текст. Нажатие на кнопку клавиатуры включает/выключает клавиатуру. Иконка файла открывает текущий путь SFTP. Кнопка буфера обмена копирует содержимое, когда текст выделен, и вставляет содержимое из буфера обмена в терминал, когда текст не выделен, а в буфере есть содержимое. Иконка кода вставляет фрагменты кода в терминал и выполняет их.", diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index d7bf66b8..3681595a 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -161,6 +161,8 @@ "size": "Boyut", "snippet": "Parça", "softWrap": "Yumuşak kaydırma", + "specifyDev": "Cihazı belirle", + "specifyDevTip": "Örneğin, ağ trafiği istatistikleri varsayılan olarak tüm cihazlar içindir. Burada belirli bir cihazı belirtebilirsiniz.", "speed": "Hız", "spentTime": "Harcanan zaman: {time}", "sshTermHelp": "Terminal kaydırılabilir olduğunda, yatay sürükleme metni seçebilir. Klavye düğmesine tıklamak klavyeyi açar/kapatır. Dosya simgesi mevcut yolu SFTP'de açar. Pano düğmesi metin seçildiğinde içeriği kopyalar ve metin seçilmediğinde ve panoda içerik olduğunda panodaki içeriği terminale yapıştırır. Kod simgesi kod parçacıklarını terminale yapıştırır ve çalıştırır.", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 7d8d2fa0..1ec4a8be 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -161,6 +161,8 @@ "size": "大小", "snippet": "代码片段", "softWrap": "自动换行", + "specifyDev": "指定设备", + "specifyDevTip": "例如网络流量统计默认是所有设备,你可以在这里指定特定的设备", "speed": "速度", "spentTime": "耗时: {time}", "sshTermHelp": "在终端可滚动时,横向拖动可以选中文字。点击键盘按钮可以开启/关闭键盘。文件图标会打开当前路径 SFTP。剪切板按钮会在有选中文字时复制内容,在未选中并且剪切板有内容时粘贴内容到终端。代码图标会粘贴代码片段到终端并执行。", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index cf7aec59..c388efd1 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -161,6 +161,8 @@ "size": "大小", "snippet": "程式片段", "softWrap": "軟換行", + "specifyDev": "指定裝置", + "specifyDevTip": "例如網路流量統計預設是所有裝置,你可以在這裡指定特定的裝置。", "speed": "速度", "spentTime": "耗時: {time}", "sshTermHelp": "在終端可滾動時,橫向拖動可以選中文字。點擊鍵盤按鈕可以開啟/關閉鍵盤。文件圖標會打開當前路徑 SFTP。剪貼簿按鈕會在有選中文字時複製內容,在未選中並且剪貼簿有內容時貼上內容到終端。代碼圖標會貼上代碼片段到終端並執行。", diff --git a/lib/view/page/server/edit.dart b/lib/view/page/server/edit.dart index 634ca57f..c5360c54 100644 --- a/lib/view/page/server/edit.dart +++ b/lib/view/page/server/edit.dart @@ -36,6 +36,8 @@ class _ServerEditPageState extends State with AfterLayoutMixin { final _wolMacCtrl = TextEditingController(); final _wolIpCtrl = TextEditingController(); final _wolPwdCtrl = TextEditingController(); + final _netDevCtrl = TextEditingController(); + final _scriptDirCtrl = TextEditingController(); final _nameFocus = FocusNode(); final _ipFocus = FocusNode(); @@ -73,6 +75,8 @@ class _ServerEditPageState extends State with AfterLayoutMixin { _wolMacCtrl.dispose(); _wolIpCtrl.dispose(); _wolPwdCtrl.dispose(); + _netDevCtrl.dispose(); + _scriptDirCtrl.dispose(); } @override @@ -295,20 +299,52 @@ class _ServerEditPageState extends State with AfterLayoutMixin { suggestion: false, ), _buildAltUrl(), + _buildScriptDir(), _buildEnvs(), - ..._buildPVEs(), - ..._buildCustomCmds(), - CenterGreyTitle(l10n.temperature), + _buildPVEs(), + _buildCustomCmds(), + _buildCustomDev(), + _buildWOLs(), + ], + ); + } + + Widget _buildScriptDir() { + return Input( + controller: _scriptDirCtrl, + type: TextInputType.text, + label: '${l10n.remotePath} (Shell ${l10n.install})', + icon: Icons.folder, + hint: '~/.config/server_box', + suggestion: false, + ); + } + + Widget _buildCustomDev() { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + CenterGreyTitle(l10n.specifyDev), + ListTile( + leading: const Icon(MingCute.question_line), + title: TipText(libL10n.note, l10n.specifyDevTip), + ).cardx, Input( controller: _preferTempDevCtrl, type: TextInputType.text, - label: libL10n.device, + label: l10n.temperature, icon: MingCute.low_temperature_line, hint: 'nvme-pci-0400', suggestion: false, ), - UIs.height7, - ..._buildWOLs(), + Input( + controller: _netDevCtrl, + type: TextInputType.text, + label: l10n.net, + icon: ZondIcons.network, + hint: 'eth0', + suggestion: false, + ), ], ); } @@ -325,102 +361,108 @@ class _ServerEditPageState extends State with AfterLayoutMixin { ); } - List _buildPVEs() { + Widget _buildPVEs() { const addr = 'https://127.0.0.1:8006'; - return [ - const CenterGreyTitle('PVE'), - Input( - controller: _pveAddrCtrl, - type: TextInputType.url, - icon: MingCute.web_line, - label: 'URL', - hint: addr, - suggestion: false, - ), - ListTile( - leading: const Icon(MingCute.certificate_line), - title: Text('PVE ${l10n.ignoreCert}'), - subtitle: Text(l10n.pveIgnoreCertTip, style: UIs.text12Grey), - trailing: ListenableBuilder( - listenable: _pveIgnoreCert, - builder: (_, __) => Switch( - value: _pveIgnoreCert.value, - onChanged: (val) { - _pveIgnoreCert.value = val; - }, - ), + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const CenterGreyTitle('PVE'), + Input( + controller: _pveAddrCtrl, + type: TextInputType.url, + icon: MingCute.web_line, + label: 'URL', + hint: addr, + suggestion: false, ), - ).cardx, - ]; + ListTile( + leading: const Icon(MingCute.certificate_line), + title: TipText('PVE ${l10n.ignoreCert}', l10n.pveIgnoreCertTip), + trailing: ListenableBuilder( + listenable: _pveIgnoreCert, + builder: (_, __) => Switch( + value: _pveIgnoreCert.value, + onChanged: (val) { + _pveIgnoreCert.value = val; + }, + ), + ), + ).cardx, + ], + ); } - List _buildCustomCmds() { - return [ - CenterGreyTitle(l10n.customCmd), - _customCmds.listenVal( - (vals) { - return ListTile( - leading: const Icon(BoxIcons.bxs_file_json), - title: const Text('JSON'), - subtitle: vals.isEmpty - ? null - : Text(vals.keys.join(','), style: UIs.textGrey), - trailing: const Icon(Icons.keyboard_arrow_right), - onTap: () async { - final res = await KvEditor.route.go( - context, - args: KvEditorArgs(data: _customCmds.value), - ); - if (res == null) return; - _customCmds.value = res; - }, - ); - }, - ).cardx, - ListTile( - leading: const Icon(MingCute.doc_line), - title: Text(libL10n.doc), - trailing: const Icon(Icons.open_in_new, size: 17), - onTap: () => l10n.customCmdDocUrl.launch(), - ).cardx, - ]; + Widget _buildCustomCmds() { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + CenterGreyTitle(l10n.customCmd), + _customCmds.listenVal( + (vals) { + return ListTile( + leading: const Icon(BoxIcons.bxs_file_json), + title: const Text('JSON'), + subtitle: vals.isEmpty + ? null + : Text(vals.keys.join(','), style: UIs.textGrey), + trailing: const Icon(Icons.keyboard_arrow_right), + onTap: () async { + final res = await KvEditor.route.go( + context, + args: KvEditorArgs(data: _customCmds.value), + ); + if (res == null) return; + _customCmds.value = res; + }, + ); + }, + ).cardx, + ListTile( + leading: const Icon(MingCute.doc_line), + title: Text(libL10n.doc), + trailing: const Icon(Icons.open_in_new, size: 17), + onTap: () => l10n.customCmdDocUrl.launch(), + ).cardx, + ], + ); } - List _buildWOLs() { - return [ - const Text('Wake On LAN (beta)', style: UIs.text13Grey), - UIs.height7, - ListTile( - leading: const Icon(BoxIcons.bxs_help_circle), - title: Text(libL10n.about), - subtitle: Text(l10n.wolTip, style: UIs.text12Grey), - ).cardx, - Input( - controller: _wolMacCtrl, - type: TextInputType.text, - label: 'MAC ${l10n.addr}', - icon: Icons.computer, - hint: '00:11:22:33:44:55', - suggestion: false, - ), - Input( - controller: _wolIpCtrl, - type: TextInputType.text, - label: 'IP ${l10n.addr}', - icon: ZondIcons.network, - hint: '192.168.1.x', - suggestion: false, - ), - Input( - controller: _wolPwdCtrl, - type: TextInputType.text, - obscureText: true, - label: l10n.pwd, - icon: Icons.password, - hint: l10n.pwd, - suggestion: false, - ), - ]; + Widget _buildWOLs() { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const CenterGreyTitle('Wake On LAN (beta)'), + ListTile( + leading: const Icon(BoxIcons.bxs_help_circle), + title: TipText(libL10n.about, l10n.wolTip), + ).cardx, + Input( + controller: _wolMacCtrl, + type: TextInputType.text, + label: 'MAC ${l10n.addr}', + icon: Icons.computer, + hint: '00:11:22:33:44:55', + suggestion: false, + ), + Input( + controller: _wolIpCtrl, + type: TextInputType.text, + label: 'IP ${l10n.addr}', + icon: ZondIcons.network, + hint: '192.168.1.x', + suggestion: false, + ), + Input( + controller: _wolPwdCtrl, + type: TextInputType.text, + obscureText: true, + label: l10n.pwd, + icon: Icons.password, + hint: l10n.pwd, + suggestion: false, + ), + ], + ); } Widget _buildFAB() { @@ -518,6 +560,8 @@ class _ServerEditPageState extends State with AfterLayoutMixin { cmds: customCmds.isEmpty ? null : customCmds, preferTempDev: _preferTempDevCtrl.text.selfIfNotNullEmpty, logoUrl: _logoUrlCtrl.text.selfIfNotNullEmpty, + netDev: _netDevCtrl.text.selfIfNotNullEmpty, + scriptDir: _scriptDirCtrl.text.selfIfNotNullEmpty, ); final wolEmpty = _wolMacCtrl.text.isEmpty && @@ -612,6 +656,9 @@ class _ServerEditPageState extends State with AfterLayoutMixin { } _env.value = spi.envs ?? {}; + + _netDevCtrl.text = spi.custom?.netDev ?? ''; + _scriptDirCtrl.text = spi.custom?.scriptDir ?? ''; } Widget _buildWriteScriptTip() { diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index ceccb9b1..35684171 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -587,7 +587,7 @@ ${ss.err?.message ?? 'null'} Widget _buildNet(ServerStatus ss, String id) { final cardNoti = _getCardNoti(id); final type = cardNoti.value.net ?? Stores.setting.netViewType.fetch(); - final device = ServerProvider.pick(id: id)?.value.spi.custom?.netDev ?? 'tailscale0'; + final device = ServerProvider.pick(id: id)?.value.spi.custom?.netDev; final (a, b) = type.build(ss, dev: device); return AnimatedSwitcher( duration: const Duration(milliseconds: 377), diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index ee3bd2e4..7a4a9f40 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -471,7 +471,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -481,7 +481,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -608,7 +608,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -618,7 +618,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -638,7 +638,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1068; + CURRENT_PROJECT_VERSION = 1069; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; @@ -649,7 +649,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.1068; + MARKETING_VERSION = 1.0.1069; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/pubspec.yaml b/pubspec.yaml index 6ecfe77a..58bdf284 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: server_box description: server status & toolbox app. publish_to: 'none' -version: 1.0.1068+1068 +version: 1.0.1069+1069 environment: sdk: ">=3.0.0"