opt add ab id

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages 2022-11-27 12:16:45 +08:00
parent 5ec0eaa9d7
commit 5616b20879
31 changed files with 148 additions and 28 deletions

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_hbb/common/formatter/id_formatter.dart';
import 'package:flutter_hbb/common/widgets/peer_card.dart';
import 'package:flutter_hbb/common/widgets/peers_view.dart';
import 'package:flutter_hbb/desktop/widgets/popup_menu.dart';
@ -237,29 +238,32 @@ class _AddressBookState extends State<AddressBook> {
}
void abAddId() async {
var field = "";
var msg = "";
var isInProgress = false;
TextEditingController controller = TextEditingController(text: field);
IDTextEditingController idController = IDTextEditingController(text: '');
TextEditingController aliasController = TextEditingController(text: '');
final tags = List.of(gFFI.abModel.tags);
var selectedTag = List<dynamic>.empty(growable: true).obs;
final style = TextStyle(fontSize: 14.0);
String? errorMsg;
gFFI.dialogManager.show((setState, close) {
submit() async {
setState(() {
msg = "";
isInProgress = true;
errorMsg = null;
});
field = controller.text.trim();
if (field.isEmpty) {
String id = idController.id;
if (id.isEmpty) {
// pass
} else {
final ids = field.trim().split(RegExp(r"[\s,;\n]+"));
field = ids.join(',');
for (final newId in ids) {
if (gFFI.abModel.idContainBy(newId)) {
continue;
}
gFFI.abModel.addId(newId);
if (gFFI.abModel.idContainBy(id)) {
setState(() {
isInProgress = false;
errorMsg = translate('ID already exists');
});
return;
}
gFFI.abModel.addId(id, aliasController.text.trim(), selectedTag);
await gFFI.abModel.pushAb();
this.setState(() {});
// final currentPeers
@ -272,21 +276,70 @@ class _AddressBookState extends State<AddressBook> {
content: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(translate("whitelist_sep")),
const SizedBox(
height: 8.0,
),
Row(
Column(
children: [
Expanded(
child: TextField(
maxLines: null,
decoration: InputDecoration(
border: const OutlineInputBorder(),
errorText: msg.isEmpty ? null : translate(msg),
Align(
alignment: Alignment.centerLeft,
child: Row(
children: [
Text(
'*',
style: TextStyle(color: Colors.red, fontSize: 14),
),
Text(
'ID',
style: style,
),
],
),
),
TextField(
controller: idController,
inputFormatters: [IDTextInputFormatter()],
decoration: InputDecoration(
isDense: true,
border: OutlineInputBorder(),
errorText: errorMsg),
style: style,
),
Align(
alignment: Alignment.centerLeft,
child: Text(
translate('Alias'),
style: style,
),
).marginOnly(top: 8, bottom: 2),
TextField(
controller: aliasController,
decoration: InputDecoration(
border: OutlineInputBorder(),
isDense: true,
),
style: style,
),
Align(
alignment: Alignment.centerLeft,
child: Text(
translate('Tags'),
style: style,
),
).marginOnly(top: 8),
Container(
child: Wrap(
children: tags
.map((e) => AddressBookTag(
name: e,
tags: selectedTag,
onTap: () {
if (selectedTag.contains(e)) {
selectedTag.remove(e);
} else {
selectedTag.add(e);
}
},
showActionMenu: false))
.toList(growable: false),
),
controller: controller,
focusNode: FocusNode()..requestFocus()),
),
],
),

View File

@ -586,6 +586,26 @@ abstract class BasePeerCard extends StatelessWidget {
);
}
@protected
MenuEntryBase<String> _addToAb(Peer peer) {
return MenuEntryButton<String>(
childBuilder: (TextStyle? style) => Text(
translate('Add to Address Book'),
style: style,
),
proc: () {
() async {
if (!gFFI.abModel.idContainBy(peer.id)) {
gFFI.abModel.addPeer(peer);
await gFFI.abModel.pushAb();
}
}();
},
padding: menuPadding,
dismissOnClicked: true,
);
}
void _rename(String id, bool isAddressBook) async {
RxBool isInProgress = false.obs;
var name = peer.alias;
@ -679,6 +699,9 @@ class RecentPeerCard extends BasePeerCard {
menuItems.add(_unrememberPasswordAction(peer.id));
}
menuItems.add(_addFavAction(peer.id));
if (!gFFI.abModel.idContainBy(peer.id)) {
menuItems.add(_addToAb(peer));
}
return menuItems;
}
}
@ -716,6 +739,9 @@ class FavoritePeerCard extends BasePeerCard {
menuItems.add(_rmFavAction(peer.id, () async {
await bind.mainLoadFavPeers();
}));
if (!gFFI.abModel.idContainBy(peer.id)) {
menuItems.add(_addToAb(peer));
}
return menuItems;
}
}
@ -744,6 +770,9 @@ class DiscoveredPeerCard extends BasePeerCard {
}
menuItems.add(MenuEntryDivider());
menuItems.add(_removeAction(peer.id, () async {}));
if (!gFFI.abModel.idContainBy(peer.id)) {
menuItems.add(_addToAb(peer));
}
return menuItems;
}
}

View File

@ -68,11 +68,21 @@ class AbModel {
peers.clear();
}
void addId(String id) async {
void addId(String id, String alias, List<dynamic> tags) {
if (idContainBy(id)) {
return;
}
peers.add(Peer.fromJson({"id": id}));
final peer = Peer.fromJson({
'id': id,
'alias': alias,
'tags': tags,
});
peers.add(peer);
}
void addPeer(Peer peer) {
peers.removeWhere((e) => e.id == peer.id);
peers.add(peer);
}
void addTag(String tag) async {

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -400,5 +400,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("wayland_experiment_tip", ""),
("Right click to select tabs", "右键选择选项卡"),
("Skipped", "已跳过"),
("Add to Address Book", "添加到地址簿"),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "Dies ist nur möglich, wenn der Zugriff nur über ein permanentes Passwort erfolgt."), // Sehr unklar. Muss noch angepasst werden. Original: Allow hiding only if accepting sessions via password and using pernament passw"),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "Permitir ocultar solo si se aceptan sesiones a través de contraseña y usando contraseña permanente"),
("wayland_experiment_tip", "El soporte para Wayland está en fase experimental, por favor, use X11 si necesita acceso desatendido."),
("Right click to select tabs", "Clic derecho para seleccionar pestañas"),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "فقط در صورت پذیرفتن جلسات از طریق رمز عبور و استفاده از رمز عبور دائمی، مخفی شدن مجاز است"),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "Autoriser le masquage uniquement si vous acceptez des sessions via un mot de passe et utilisez un mot de passe permanent"),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "Να επιτρέπεται η απόκρυψη, μόνο εάν αποδέχεστε συνδέσεις μέσω κωδικού πρόσβασης και χρησιμοποιείτε μόνιμο κωδικό πρόσβασης"),
("wayland_experiment_tip", "Η υποστήριξη Wayland βρίσκεται σε πειραματικό στάδιο, χρησιμοποιήστε το X11 εάν χρειάζεστε πρόσβαση χωρίς επίβλεψη."),
("Right click to select tabs", "Κάντε δεξί κλικ για να επιλέξετε καρτέλες"),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "Permetti di nascondere solo se si accettano sessioni con password permanente"),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "Разрешать скрытие случае, если принимаются сеансы по паролю или используется постоянный пароль"),
("wayland_experiment_tip", "Поддержка Wayland находится на экспериментальной стадии, используйте X11, если вам требуется автоматический доступ."),
("Right click to select tabs", "Выбор вкладок щелчком правой кнопки мыши"),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "Kjo është e mundur vetëm nëse aksesi bëhet nëpërmjet një fjalëkalimi të përhershëm"),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "Tillåt att gömma endast om accepterande sessioner med lösenord och permanenta lösenord"),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", "在只允許密碼連接並且只用固定密碼的情況下才允許隱藏"),
("wayland_experiment_tip", ""),
("Right click to select tabs", "右鍵選擇選項卡"),
("Add to Address Book", "添加到地址簿"),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}

View File

@ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
("hide_cm_tip", ""),
("wayland_experiment_tip", ""),
("Right click to select tabs", ""),
("Add to Address Book", ""),
].iter().cloned().collect();
}