fix(ui): 表单校验加固与对话框生命周期

- 端口 1~65535(0 不是可连接端口);接收上限/最大报文长度/主题别名上限拒 0——MQTT 5 规范定义为 Protocol Error,broker 直接断连且值会被持久化,表现为每次连接都失败
- 遗嘱主题 trim 后入库,并拒绝包含通配符 + / #(通配符只用于订阅过滤器)
- 16 个被校验字段订阅输入变更:编辑即清空字段错误,红字不再滞后于实际输入(此前错误只在保存时登记,改好值后红字仍挂着)
- 传输切换只按「上一个方式」的默认端口覆盖端口:与全部默认端口比较会把用户手输的 8084/8883 误判为默认值,WSS:9443 → TCP → WSS 往返丢端口
- 五个对话框 open() 统一加 has_active_dialog 守卫:对话框是栈式叠加,多入口重复 open 会压入第二个模态,同 id 控件在两层间串台
- 阿里云预设对话框表单预填即选中第一项:此前 selected=None,打开即保存会 push 一条内容相同的重复预设
- OptionDelegate::position 按框架契约实现(按值反查索引):恒返回 None 会让 set_selected_value 失效、下拉显示空
- 非 Windows 不渲染置顶按钮:set_topmost 恒 false,显示必然报错的按钮只会让人困惑
- 主题键名对齐 gpui-component 的 serde rename:font.size / radius.lg 此前被静默忽略,14px 紧凑排版从未生效(实际渲染 16px)
- aliyun.rs DeviceName 空值校验;Cargo.toml 声明 Apache-2.0(与关于页一致)
This commit is contained in:
2026-09-30 10:16:17 +08:00
parent 9b6df8b9eb
commit 7684eedd0f
10 changed files with 184 additions and 54 deletions
+7 -3
View File
@@ -49,13 +49,17 @@ impl SearchableListDelegate for OptionDelegate {
fn item(&self, ix: IndexPath) -> Option<&Self::Item> {
self.items.get(ix.row)
}
fn position<V>(&self, _value: &V) -> Option<IndexPath>
fn position<V>(&self, value: &V) -> Option<IndexPath>
where
Self::Item: SearchableListItem<Value = V>,
V: PartialEq,
{
// 选中项统一通过 IndexPath 构造,无需按值反查
None
// 框架契约:按值反查索引,set_selected_value 与过滤视图都依赖它。
// 返回 None 会导致下拉显示空、保存写默认值,这里必须如实实现。
self.items
.iter()
.position(|i| i.value() == value)
.map(IndexPath::new)
}
}