params.wxml 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. <navigation-bar background="{{themeMode === 'dark' ? '#111827' : '#FFF'}}"></navigation-bar>
  2. <view wx:if="{{toastText}}" class="page-toast page-toast--{{toastType}} {{themeClass}}">
  3. {{toastText}}
  4. </view>
  5. <view class="subpage-fixed-header subpage-fixed-header--generic {{themeClass}}">
  6. <view class="subpage-page-header">
  7. <view wx:if="{{activeParamView == 'parameterGroups'}}" class="panel-actions subpage-actions generic-protocol-actions">
  8. <view wx:if="{{isStorageAccessProtocol}}" class="panel-action-button" bindtap="clearStorageAccessGroups">清除</view>
  9. <view class="panel-action-button {{connectedDevice ? '' : 'is-disabled'}}" bindtap="readAllParameterGroups">读取</view>
  10. <view class="panel-action-button" bindtap="saveParameterGroupsJson">保存</view>
  11. <view class="panel-action-button" bindtap="importParameterGroupsJson">加载</view>
  12. <view wx:if="{{isStorageAccessProtocol}}" class="panel-action-button" bindtap="completeParameterStructs">结构</view>
  13. <view wx:if="{{isModbusProtocol}}" class="panel-action-button panel-action-button--icon" bindtap="openParameterDraft">+</view>
  14. </view>
  15. <view wx:elif="{{activeParamView == 'parameterGroup'}}" class="panel-actions subpage-actions">
  16. <view
  17. class="panel-action-button {{connectedDevice && !activeParameterGroup.addressOverflow ? '' : 'is-disabled'}}"
  18. data-group-id="{{activeParameterGroup.id}}"
  19. bindtap="readParameterGroup"
  20. >读取</view>
  21. <view
  22. wx:if="{{activeParameterGroup.writable}}"
  23. class="panel-action-button {{connectedDevice && !activeParameterGroup.addressOverflow ? '' : 'is-disabled'}}"
  24. data-group-id="{{activeParameterGroup.id}}"
  25. bindtap="writeParameterGroup"
  26. >写入</view>
  27. <view class="panel-action-button" bindtap="backToParamsHome">返回</view>
  28. </view>
  29. </view>
  30. </view>
  31. <scroll-view class="scrollarea {{themeClass}} scrollarea--subpage scrollarea--generic" scroll-y type="list">
  32. <view class="page-shell">
  33. <block wx:if="{{activeParamView == 'parameterGroups'}}">
  34. <view
  35. wx:for="{{parameterGroups}}"
  36. wx:for-item="group"
  37. wx:key="id"
  38. class="generic-group-shell {{group.deleteVisible ? 'is-delete-visible' : ''}}"
  39. >
  40. <view
  41. wx:if="{{!group.expanded && group.deleteVisible}}"
  42. class="generic-delete-action"
  43. data-group-id="{{group.id}}"
  44. bindtap="deleteParameterGroup"
  45. >
  46. -
  47. </view>
  48. <view
  49. class="panel generic-group-panel {{group.expanded ? '' : 'panel--collapsed'}}"
  50. data-group-id="{{group.id}}"
  51. bindtouchstart="onParameterGroupTouchStart"
  52. bindtouchend="onParameterGroupTouchEnd"
  53. bindlongpress="openStorageParameterGroupDetail"
  54. >
  55. <view class="panel-header panel-header--with-actions">
  56. <block wx:if="{{group.isStorageScalarGroup}}">
  57. <view
  58. class="panel-heading-toggle generic-scalar-heading"
  59. data-group-id="{{group.id}}"
  60. bindtap="openParameterGroup"
  61. >
  62. <view class="panel-icon icon-terminal">
  63. <image class="panel-icon-image" src="/assets/icons/terminal-white.png" mode="aspectFit" />
  64. </view>
  65. <view class="generic-group-title-wrap">
  66. <view class="panel-title" data-group-id="{{group.id}}">{{group.displayName || group.name}}</view>
  67. <view class="param-meta generic-group-meta">{{group.storageCardMetaText || group.addressRangeText}}</view>
  68. </view>
  69. </view>
  70. <block wx:if="{{group.isStorageEnumScalar}}">
  71. <view class="generic-register-input-wrap generic-scalar-input-wrap">
  72. <input
  73. class="value-input generic-register-value {{group.registers[0].isDirty ? 'value-input--dirty' : ''}}"
  74. data-group-id="{{group.id}}"
  75. data-index="0"
  76. value="{{group.scalarInputValueText}}"
  77. catchtap="noop"
  78. bindinput="onParameterRegisterValueInput"
  79. bindblur="onParameterRegisterValueBlur"
  80. catchlongpress="noop"
  81. />
  82. </view>
  83. </block>
  84. <view wx:else class="generic-scalar-value">{{group.scalarValueText || ''}}</view>
  85. </block>
  86. <block wx:else>
  87. <view
  88. class="panel-heading-toggle"
  89. data-group-id="{{group.id}}"
  90. bindtap="openParameterGroup"
  91. >
  92. <view class="panel-icon icon-terminal">
  93. <image class="panel-icon-image" src="/assets/icons/terminal-white.png" mode="aspectFit" />
  94. </view>
  95. <view class="generic-group-title-wrap">
  96. <view class="panel-title" data-group-id="{{group.id}}" catchlongpress="openParameterGroupEdit">{{group.displayName || group.name}}</view>
  97. <block wx:if="{{isStorageAccessProtocol}}">
  98. <view class="param-meta generic-group-meta">{{group.storageCardMetaText || group.addressRangeText}}</view>
  99. </block>
  100. <block wx:else>
  101. <view wx:if="{{group.listMetaText || !group.sourceMetadataLocked}}" class="param-meta generic-group-meta">{{group.listMetaText || group.addressRangeText}}</view>
  102. </block>
  103. </view>
  104. </view>
  105. <view wx:if="{{isModbusProtocol}}" class="panel-actions generic-group-actions">
  106. <view
  107. class="panel-action-button {{connectedDevice && !group.addressOverflow ? '' : 'is-disabled'}}"
  108. data-group-id="{{group.id}}"
  109. bindtap="readParameterGroup"
  110. >
  111. 读取
  112. </view>
  113. <view
  114. wx:if="{{group.writable}}"
  115. class="panel-action-button {{connectedDevice && !group.addressOverflow ? '' : 'is-disabled'}}"
  116. data-group-id="{{group.id}}"
  117. bindtap="writeParameterGroup"
  118. >
  119. 写入
  120. </view>
  121. <view wx:if="{{parameterCardControlEnabled}}" class="entry-chevron"></view>
  122. </view>
  123. </block>
  124. </view>
  125. <view wx:if="{{!parameterCardControlEnabled && group.expanded}}" class="generic-group-inline-registers">
  126. <view
  127. wx:for="{{group.registers}}"
  128. wx:for-item="register"
  129. wx:for-index="registerIndex"
  130. wx:key="id"
  131. class="generic-register-row generic-register-row--inline"
  132. >
  133. <view class="generic-register-layout-spacer"></view>
  134. <view class="generic-register-main">
  135. <view
  136. class="generic-register-name"
  137. data-group-id="{{group.id}}"
  138. data-index="{{registerIndex}}"
  139. bindtap="openParameterRegisterInfo"
  140. catchlongpress="openParameterRegisterEdit"
  141. >
  142. {{register.displayName || register.name}}
  143. </view>
  144. <view wx:if="{{register.metaText || !register.sourceMetadataLocked}}" class="generic-register-meta">
  145. <text>{{register.metaText || (register.addressText + (register.rawValueText ? ' ' + register.rawValueText : ''))}}</text>
  146. </view>
  147. </view>
  148. <view class="generic-register-input-wrap {{register.showUnit && register.unit ? 'generic-register-input-wrap--unit' : ''}}">
  149. <block wx:if="{{group.writable}}">
  150. <block wx:if="{{register.conversionFormula}}">
  151. <view class="param-value generic-readonly-value">{{register.displayValue || '--'}}{{register.showUnit && register.unit ? ' ' + register.unit : ''}}</view>
  152. </block>
  153. <block wx:else>
  154. <input
  155. class="value-input generic-register-value {{register.isDirty ? 'value-input--dirty' : ''}}"
  156. data-group-id="{{group.id}}"
  157. data-index="{{registerIndex}}"
  158. value="{{register.inputValue}}"
  159. bindinput="onParameterRegisterValueInput"
  160. bindblur="onParameterRegisterValueBlur"
  161. />
  162. <view wx:if="{{register.showUnit && register.unit}}" class="generic-register-unit">{{register.unit}}</view>
  163. </block>
  164. </block>
  165. <view wx:else class="param-value generic-readonly-value">{{register.displayValue || '--'}}{{register.showUnit && register.unit ? ' ' + register.unit : ''}}</view>
  166. <view wx:if="{{register.displayMetaText}}" class="generic-register-display-meta">{{register.displayMetaText}}</view>
  167. </view>
  168. </view>
  169. </view>
  170. </view>
  171. </view>
  172. </block>
  173. <block wx:elif="{{activeParamView == 'parameterGroup'}}">
  174. <view wx:if="{{activeParameterGroup}}" class="panel generic-group-detail-panel">
  175. <view class="generic-group-detail-header">
  176. <view class="panel-title">{{activeParameterGroup.detailTitleText || activeParameterGroup.displayName || activeParameterGroup.name}}</view>
  177. </view>
  178. <view wx:if="{{activeParameterGroup.detailMetaText || !activeParameterGroup.sourceMetadataLocked}}" class="generic-group-detail-meta">
  179. {{activeParameterGroup.detailMetaText || activeParameterGroup.addressRangeText}}
  180. </view>
  181. <view
  182. wx:for="{{activeParameterRegisterRows.length ? activeParameterRegisterRows : activeParameterGroup.registers}}"
  183. wx:for-item="register"
  184. wx:for-index="registerIndex"
  185. wx:key="id"
  186. class="generic-register-row {{register.dragClass}}"
  187. style="{{register.dragStyle}}"
  188. >
  189. <view
  190. wx:if="{{!activeParameterGroup.isStructLayout && !activeParameterGroup.sourceMetadataLocked}}"
  191. class="generic-register-drag-handle {{register.dragHandleClass}}"
  192. data-group-id="{{activeParameterGroup.id}}"
  193. data-index="{{register.sourceIndex !== undefined ? register.sourceIndex : registerIndex}}"
  194. catchtouchstart="onParameterRegisterDragStart"
  195. catchtouchmove="onParameterRegisterDragMove"
  196. catchtouchend="onParameterRegisterDragEnd"
  197. catchtouchcancel="onParameterRegisterDragCancel"
  198. >
  199. <view class="generic-register-drag-bar"></view>
  200. <view class="generic-register-drag-bar"></view>
  201. <view class="generic-register-drag-bar"></view>
  202. </view>
  203. <view wx:else class="generic-register-layout-spacer"></view>
  204. <view class="generic-register-main">
  205. <view
  206. class="generic-register-name"
  207. data-group-id="{{activeParameterGroup.id}}"
  208. data-index="{{register.sourceIndex !== undefined ? register.sourceIndex : registerIndex}}"
  209. bindtap="openParameterRegisterInfo"
  210. catchlongpress="openParameterRegisterEdit"
  211. >
  212. {{register.displayName || register.name}}
  213. </view>
  214. <view wx:if="{{register.metaText || !register.sourceMetadataLocked}}" class="generic-register-meta">
  215. <text>{{register.metaText || (register.addressText + (register.rawValueText ? ' ' + register.rawValueText : ''))}}</text>
  216. </view>
  217. </view>
  218. <view class="generic-register-input-wrap {{register.showUnit && register.unit ? 'generic-register-input-wrap--unit' : ''}}">
  219. <block wx:if="{{activeParameterGroup.writable}}">
  220. <block wx:if="{{register.conversionFormula}}">
  221. <view class="param-value generic-readonly-value">{{register.displayValue || '--'}}{{register.showUnit && register.unit ? ' ' + register.unit : ''}}</view>
  222. </block>
  223. <block wx:else>
  224. <input
  225. class="value-input generic-register-value {{register.isDirty ? 'value-input--dirty' : ''}}"
  226. data-group-id="{{activeParameterGroup.id}}"
  227. data-index="{{register.sourceIndex !== undefined ? register.sourceIndex : registerIndex}}"
  228. value="{{register.inputValue}}"
  229. bindinput="onParameterRegisterValueInput"
  230. bindblur="onParameterRegisterValueBlur"
  231. />
  232. <view wx:if="{{register.showUnit && register.unit}}" class="generic-register-unit">{{register.unit}}</view>
  233. </block>
  234. </block>
  235. <view wx:else class="param-value generic-readonly-value">{{register.displayValue || '--'}}{{register.showUnit && register.unit ? ' ' + register.unit : ''}}</view>
  236. <view wx:if="{{register.displayMetaText}}" class="generic-register-display-meta">{{register.displayMetaText}}</view>
  237. </view>
  238. </view>
  239. </view>
  240. </block>
  241. </view>
  242. </scroll-view>
  243. <view wx:if="{{parameterDialog.visible}}" class="generic-dialog-mask {{themeClass}}" bindtap="closeParameterDraft">
  244. <view class="generic-dialog" catchtap="noop">
  245. <view class="generic-dialog-header">
  246. <view class="generic-dialog-title">{{parameterDialog.title}}</view>
  247. <view class="generic-dialog-close" bindtap="closeParameterDraft">×</view>
  248. </view>
  249. <block wx:if="{{parameterDialog.mode == 'createGroup' || parameterDialog.mode == 'editGroup'}}">
  250. <view class="generic-dialog-body">
  251. <block wx:if="{{parameterDialog.metadataLocked}}">
  252. <view class="generic-info-stack">
  253. <view class="generic-info-row">
  254. <view class="generic-info-label">名称</view>
  255. <view class="generic-info-value">{{parameterDialog.groupName}}</view>
  256. </view>
  257. <view wx:if="{{parameterDialog.sourceDisplayText}}" class="generic-info-row">
  258. <view class="generic-info-label">来源</view>
  259. <view class="generic-info-value">{{parameterDialog.sourceDisplayText}}</view>
  260. </view>
  261. <view wx:if="{{parameterDialog.sourceAddressText}}" class="generic-info-row">
  262. <view class="generic-info-label">起始地址</view>
  263. <view class="generic-info-value">{{parameterDialog.sourceAddressText}}</view>
  264. </view>
  265. <view wx:if="{{parameterDialog.sourceByteLength}}" class="generic-info-row">
  266. <view class="generic-info-label">长度</view>
  267. <view class="generic-info-value">{{parameterDialog.sourceByteLength}}B</view>
  268. </view>
  269. <view wx:if="{{parameterDialog.sourceTypeText}}" class="generic-info-row">
  270. <view class="generic-info-label">类型</view>
  271. <view class="generic-info-value">{{parameterDialog.sourceTypeText}}</view>
  272. </view>
  273. <view wx:if="{{parameterDialog.enumOptions.length}}" class="generic-info-row generic-info-row--toggle" bindtap="toggleParameterEnumOptions">
  274. <view class="generic-info-label">枚举</view>
  275. <view class="generic-info-value generic-info-value--toggle">
  276. <text>{{parameterDialog.enumExpanded ? '收起' : '展开'}}</text>
  277. <view class="entry-chevron {{parameterDialog.enumExpanded ? 'is-expanded' : ''}}"></view>
  278. </view>
  279. </view>
  280. <view wx:if="{{parameterDialog.enumOptions.length && parameterDialog.enumExpanded}}" class="generic-info-row generic-info-row--enum-list">
  281. <view class="generic-info-label"></view>
  282. <scroll-view class="generic-info-value generic-info-value--enum-list" scroll-y>
  283. <view wx:for="{{parameterDialog.enumOptions}}" wx:for-item="option" wx:key="text">{{option.text}}</view>
  284. </scroll-view>
  285. </view>
  286. <view wx:if="{{parameterDialog.showPollEnabled}}" class="generic-info-row">
  287. <view class="generic-info-label">参与轮询</view>
  288. <switch
  289. checked="{{parameterDialog.pollEnabled}}"
  290. color="#0f766e"
  291. data-field="pollEnabled"
  292. bindchange="onParameterDraftSwitchChange"
  293. />
  294. </view>
  295. </view>
  296. </block>
  297. <block wx:else>
  298. <view class="generic-config-row">
  299. <view class="param-main">
  300. <view class="param-name">{{isStorageAccessProtocol ? '结构体组名' : '寄存器组名'}}</view>
  301. <view class="param-meta">{{isStorageAccessProtocol ? '内存地址连续' : '每组寄存器地址连续'}}</view>
  302. </view>
  303. <input
  304. class="value-input generic-value-input"
  305. data-field="groupName"
  306. value="{{parameterDialog.groupName}}"
  307. bindinput="onParameterDraftInput"
  308. />
  309. </view>
  310. <view wx:if="{{isModbusProtocol}}" class="generic-config-row">
  311. <view class="param-main">
  312. <view class="param-name">寄存器类型</view>
  313. <view class="param-meta">决定读取功能码与是否可写</view>
  314. </view>
  315. <picker
  316. mode="selector"
  317. range="{{parameterRegisterTypeOptions}}"
  318. range-key="label"
  319. value="{{parameterDialog.registerTypeIndex}}"
  320. bindchange="onParameterDraftTypeChange"
  321. >
  322. <view class="generic-picker-value">{{parameterDialog.registerTypeText}}</view>
  323. </picker>
  324. </view>
  325. <view class="generic-config-row">
  326. <view class="param-main">
  327. <view class="param-name">{{isStorageAccessProtocol ? '内存起始地址' : '寄存器起始地址'}}</view>
  328. <view class="param-meta">{{isStorageAccessProtocol ? '16进制,最多 8 位,例如 000000A0' : '16进制,例如 00A0'}}</view>
  329. </view>
  330. <input
  331. class="value-input generic-value-input"
  332. data-field="startAddress"
  333. value="{{parameterDialog.startAddress}}"
  334. bindinput="onParameterDraftInput"
  335. />
  336. </view>
  337. <view class="generic-config-row">
  338. <view class="param-main">
  339. <view class="param-name">{{isStorageAccessProtocol ? '字节长度' : '寄存器数量'}}</view>
  340. <view class="param-meta">{{parameterDialog.structParsedSummary || '1 - 256'}}</view>
  341. </view>
  342. <input
  343. class="value-input generic-value-input"
  344. type="number"
  345. data-field="quantity"
  346. value="{{parameterDialog.quantity}}"
  347. bindinput="onParameterDraftInput"
  348. />
  349. </view>
  350. <view wx:if="{{parameterDialog.showPollEnabled}}" class="generic-config-row">
  351. <view class="param-main">
  352. <view class="param-name">参与轮询</view>
  353. <view class="param-meta">自动轮询</view>
  354. </view>
  355. <switch
  356. checked="{{parameterDialog.pollEnabled}}"
  357. color="#0f766e"
  358. data-field="pollEnabled"
  359. bindchange="onParameterDraftSwitchChange"
  360. />
  361. </view>
  362. <view wx:if="{{parameterDialog.mode == 'createGroup'}}" class="generic-struct-section">
  363. <view class="generic-struct-header">
  364. <view class="param-main">
  365. <view class="param-name">结构体/枚举定义</view>
  366. <view class="param-meta">支持 typedef struct、typedef enum、typedef 别名与数组</view>
  367. </view>
  368. <view class="panel-action-button" bindtap="parseParameterStructDefinition">解析</view>
  369. </view>
  370. <textarea
  371. class="generic-struct-input"
  372. maxlength="-1"
  373. placeholder="粘贴 C 结构体/枚举定义"
  374. data-field="structDefinition"
  375. value="{{parameterDialog.structDefinition}}"
  376. bindinput="onParameterDraftInput"
  377. />
  378. </view>
  379. </block>
  380. </view>
  381. </block>
  382. <block wx:elif="{{parameterDialog.mode == 'editRegister' || parameterDialog.mode == 'viewRegister'}}">
  383. <view class="generic-dialog-body">
  384. <view class="generic-info-stack">
  385. <view class="generic-info-row">
  386. <view class="generic-info-label">名称</view>
  387. <view wx:if="{{parameterDialog.mode == 'viewRegister' || parameterDialog.metadataLocked}}" class="generic-info-value">{{parameterDialog.name}}</view>
  388. <input wx:else class="value-input generic-value-input" data-field="name" value="{{parameterDialog.name}}" bindinput="onParameterDraftInput" />
  389. </view>
  390. <view class="generic-info-row">
  391. <view class="generic-info-label">地址</view>
  392. <view class="generic-info-value">{{parameterDialog.addressText}}</view>
  393. </view>
  394. <view wx:if="{{parameterDialog.sourceByteLength}}" class="generic-info-row">
  395. <view class="generic-info-label">长度</view>
  396. <view class="generic-info-value">{{parameterDialog.sourceByteLength}}B</view>
  397. </view>
  398. <view wx:if="{{parameterDialog.showDataType}}" class="generic-info-row">
  399. <view class="generic-info-label">类型</view>
  400. <view wx:if="{{parameterDialog.mode == 'viewRegister' || parameterDialog.metadataLocked}}" class="generic-info-value">{{parameterDialog.sourceTypeText || parameterDialog.dataTypeText}}</view>
  401. <picker wx:else mode="selector" range="{{parameterDataTypeOptions}}" range-key="label" value="{{parameterDialog.dataTypeIndex}}" bindchange="onParameterDialogDataTypeChange">
  402. <view class="generic-picker-value">{{parameterDialog.dataTypeText}}</view>
  403. </picker>
  404. </view>
  405. <view wx:if="{{parameterDialog.enumOptions.length}}" class="generic-info-row generic-info-row--toggle" bindtap="toggleParameterEnumOptions">
  406. <view class="generic-info-label">枚举</view>
  407. <view class="generic-info-value generic-info-value--toggle">
  408. <text>{{parameterDialog.enumExpanded ? '收起' : '展开'}}</text>
  409. <view class="entry-chevron {{parameterDialog.enumExpanded ? 'is-expanded' : ''}}"></view>
  410. </view>
  411. </view>
  412. <view wx:if="{{parameterDialog.enumOptions.length && parameterDialog.enumExpanded}}" class="generic-info-row generic-info-row--enum-list">
  413. <view class="generic-info-label"></view>
  414. <scroll-view class="generic-info-value generic-info-value--enum-list" scroll-y>
  415. <view wx:for="{{parameterDialog.enumOptions}}" wx:for-item="option" wx:key="text">{{option.text}}</view>
  416. </scroll-view>
  417. </view>
  418. <view wx:if="{{parameterDialog.showTextLength}}" class="generic-info-row">
  419. <view class="generic-info-label">长度</view>
  420. <view wx:if="{{parameterDialog.mode == 'viewRegister' || parameterDialog.metadataLocked}}" class="generic-info-value">{{parameterDialog.textByteLength || '--'}}B</view>
  421. <input wx:else class="value-input generic-value-input" type="number" data-field="textByteLength" value="{{parameterDialog.textByteLength}}" bindinput="onParameterDraftInput" />
  422. </view>
  423. <view class="generic-info-row">
  424. <view class="generic-info-label">备注</view>
  425. <view wx:if="{{parameterDialog.mode == 'viewRegister'}}" class="generic-info-value">{{parameterDialog.remark || '--'}}</view>
  426. <input wx:else class="value-input generic-value-input" data-field="remark" value="{{parameterDialog.remark}}" bindinput="onParameterDraftInput" />
  427. </view>
  428. <view wx:if="{{parameterDialog.showPollEnabled}}" class="generic-info-row">
  429. <view class="generic-info-label">参与轮询</view>
  430. <switch
  431. checked="{{parameterDialog.pollEnabled}}"
  432. color="#0f766e"
  433. data-field="pollEnabled"
  434. bindchange="onParameterDraftSwitchChange"
  435. />
  436. </view>
  437. <view wx:if="{{!parameterDialog.isEnumType && parameterDialog.showUnit}}" class="generic-info-row">
  438. <view class="generic-info-label">单位</view>
  439. <view wx:if="{{parameterDialog.mode == 'viewRegister'}}" class="generic-info-value">{{parameterDialog.unit || '--'}}</view>
  440. <input wx:else class="value-input generic-value-input" data-field="unit" value="{{parameterDialog.unit}}" bindinput="onParameterDraftInput" />
  441. </view>
  442. <view wx:if="{{!parameterDialog.isEnumType && parameterDialog.showDataType}}" class="generic-info-row">
  443. <view class="generic-info-label">公式</view>
  444. <view wx:if="{{parameterDialog.mode == 'viewRegister'}}" class="generic-info-value">{{parameterDialog.conversionFormula || '--'}}</view>
  445. <input wx:else class="value-input generic-value-input" data-field="conversionFormula" value="{{parameterDialog.conversionFormula}}" placeholder="x" bindinput="onParameterDraftInput" />
  446. </view>
  447. <view wx:if="{{!parameterDialog.isEnumType && parameterDialog.conversionFormulaErrorText}}" class="generic-info-row">
  448. <view class="generic-info-label">公式</view>
  449. <view class="generic-info-value">{{parameterDialog.conversionFormulaErrorText}}</view>
  450. </view>
  451. <view wx:if="{{!parameterDialog.isEnumType && (parameterDialog.mode == 'viewRegister' || parameterDialog.showRange)}}" class="generic-info-row">
  452. <view class="generic-info-label">最小值</view>
  453. <view wx:if="{{parameterDialog.mode == 'viewRegister'}}" class="generic-info-value">{{parameterDialog.minValue || '--'}}</view>
  454. <input wx:else class="value-input generic-value-input" data-field="minValue" value="{{parameterDialog.minValue}}" bindinput="onParameterDraftInput" />
  455. </view>
  456. <view wx:if="{{!parameterDialog.isEnumType && (parameterDialog.mode == 'viewRegister' || parameterDialog.showRange)}}" class="generic-info-row">
  457. <view class="generic-info-label">最大值</view>
  458. <view wx:if="{{parameterDialog.mode == 'viewRegister'}}" class="generic-info-value">{{parameterDialog.maxValue || '--'}}</view>
  459. <input wx:else class="value-input generic-value-input" data-field="maxValue" value="{{parameterDialog.maxValue}}" bindinput="onParameterDraftInput" />
  460. </view>
  461. </view>
  462. </view>
  463. </block>
  464. <view class="generic-draft-actions">
  465. <view class="panel-action-button" bindtap="closeParameterDraft">{{parameterDialog.cancelText}}</view>
  466. <view wx:if="{{parameterDialog.confirmText}}" class="panel-action-button is-active" bindtap="confirmParameterDialog">{{parameterDialog.confirmText}}</view>
  467. </view>
  468. </view>
  469. </view>