[F2] DAG 节点面板(左侧拖拽区)

- apps/web-antd/src/components/iot-dag/DagNodePanel.vue
  - 3 类分组 collapse + 搜索过滤 + 加载/错误/空态
- apps/web-antd/src/components/iot-dag/NodeTypeCard.vue
  - HTML5 dragstart 双 MIME:application/x-iot-dag-node + text/plain
  - payload: { type: providerType, category: dagNodeType }
- apps/web-antd/src/components/iot-dag/hooks/useNodeCatalog.ts
  - Mock 13 节点类型(5 trigger / 3 condition / 5 action)
  - fetcher 可注入、permissionFilter 预留
  - TODO(F3/F7): 替换为 @vben/request /iot/rule/provider/metadata
- apps/web-antd/src/components/iot-dag/__tests__/useNodeCatalog.spec.ts 17 用例
- apps/web-antd/src/components/iot-dag/index.ts barrel 增加 DagNodePanel/NodeTypeCard
- i18n: iot.dag.panel.* + iot.dag.node.<type>.{name,desc} zh-CN/en-US 同步
- Known Pitfalls 落地: ⚠️ Firefox dataTransfer 双 MIME / 权限过滤预留 / icon Lucide 名

note: Acceptance #3 drop 由 F3/F7 DagCanvasContainer 实现,F2 只负责发送方。
      图标通过 data-icon attribute 传递,F3/F7 集成时接入 lucide-vue-next 渲染。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
lzh
2026-04-23 22:07:37 +08:00
parent 5253a7a818
commit 8613641d1d
7 changed files with 985 additions and 0 deletions

View File

@@ -53,6 +53,72 @@
"canvas": {
"readonly": "Read-only mode",
"empty": "Drag nodes to canvas to start"
},
"panel": {
"title": "Node Types",
"searchPlaceholder": "Search nodes...",
"loading": "Loading...",
"loadError": "Load failed, please refresh",
"noMatch": "No matching nodes found",
"category": {
"trigger": "Trigger",
"condition": "Condition",
"action": "Action"
}
},
"node": {
"device_state": {
"name": "Device State",
"desc": "Triggered when device goes online/offline"
},
"device_property": {
"name": "Device Property Report",
"desc": "Triggered when device reports property data"
},
"device_event": {
"name": "Device Event",
"desc": "Triggered when device reports an event"
},
"device_service": {
"name": "Device Service Call",
"desc": "Triggered when device service is invoked"
},
"timer": {
"name": "Timer",
"desc": "Triggered by Cron expression on schedule"
},
"expression": {
"name": "Expression",
"desc": "Aviator expression evaluation condition"
},
"time_range": {
"name": "Time Range",
"desc": "Check if current time is within a specified range"
},
"condition_device_state": {
"name": "Device State Check",
"desc": "Check current device online status"
},
"property_set": {
"name": "Set Property",
"desc": "Send property set command to device"
},
"service_invoke": {
"name": "Invoke Service",
"desc": "Invoke device service"
},
"alarm_trigger": {
"name": "Trigger Alarm",
"desc": "Trigger a device alarm"
},
"alarm_clear": {
"name": "Clear Alarm",
"desc": "Clear a device alarm"
},
"notify": {
"name": "Send Notification",
"desc": "Send notification (SMS/Email/Webhook)"
}
}
}
}

View File

@@ -53,6 +53,72 @@
"canvas": {
"readonly": "只读模式",
"empty": "拖拽节点到画布开始编排"
},
"panel": {
"title": "节点类型",
"searchPlaceholder": "搜索节点...",
"loading": "加载中...",
"loadError": "加载失败,请刷新重试",
"noMatch": "未找到匹配节点",
"category": {
"trigger": "触发器",
"condition": "条件",
"action": "动作"
}
},
"node": {
"device_state": {
"name": "设备状态",
"desc": "设备上线/下线时触发"
},
"device_property": {
"name": "设备属性上报",
"desc": "设备属性数据上报时触发"
},
"device_event": {
"name": "设备事件",
"desc": "设备上报事件时触发"
},
"device_service": {
"name": "设备服务调用",
"desc": "设备服务被调用时触发"
},
"timer": {
"name": "定时触发",
"desc": "按 Cron 表达式定时触发"
},
"expression": {
"name": "表达式判断",
"desc": "Aviator 表达式计算条件"
},
"time_range": {
"name": "时间段判断",
"desc": "判断当前时间是否在指定范围"
},
"condition_device_state": {
"name": "设备状态判断",
"desc": "判断设备当前在线状态"
},
"property_set": {
"name": "下发属性",
"desc": "向设备下发属性设置指令"
},
"service_invoke": {
"name": "调用服务",
"desc": "调用设备服务"
},
"alarm_trigger": {
"name": "触发告警",
"desc": "触发设备告警"
},
"alarm_clear": {
"name": "清除告警",
"desc": "清除设备告警"
},
"notify": {
"name": "发送通知",
"desc": "发送消息通知(短信/邮件/webhook"
}
}
}
}