1
0

dialog-handlers.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. const {
  2. createParameterGroupConfig,
  3. createParameterGroupDialogState,
  4. createParameterDialogState,
  5. createParameterRegisterChangedData,
  6. createParameterRegisterDialogState,
  7. findParameterGroup,
  8. findParameterRegister,
  9. getDialogDataTypeState,
  10. getOption
  11. } = require('./view-model.js')
  12. const {
  13. buildActiveParameterRegisterRows
  14. } = require('./drag-view-model.js')
  15. function getParameterGroupsFromState(state = {}) {
  16. return state.parameterGroups || []
  17. }
  18. function createDialogHandlers(parameterGroupService) {
  19. return {
  20. updateParameterDialog(changedData) {
  21. this.setData({
  22. parameterDialog: {
  23. ...this.data.parameterDialog,
  24. ...changedData
  25. }
  26. })
  27. },
  28. openParameterDraft(event) {
  29. const groupId = event && event.currentTarget && event.currentTarget.dataset
  30. ? event.currentTarget.dataset.groupId
  31. : ''
  32. const group = groupId ? findParameterGroup(getParameterGroupsFromState(this.data), groupId) : null
  33. this.updateParameterDialog(createParameterGroupDialogState(group))
  34. },
  35. closeParameterDraft() {
  36. this.parameterGroupLongPressGuard = ''
  37. this.parameterRegisterLongPressGuard = ''
  38. this.updateParameterDialog(createParameterDialogState())
  39. },
  40. onParameterDraftInput(event) {
  41. const field = event.currentTarget.dataset.field
  42. if (!field) return
  43. const value = event.detail.value
  44. this.updateParameterDialog({
  45. [field]: value,
  46. ...(field === 'structDefinition' ? {
  47. parsedStructRegisters: [],
  48. structParsedSummary: ''
  49. } : {})
  50. })
  51. },
  52. parseParameterStructDefinition() {
  53. const dialog = this.data.parameterDialog || createParameterDialogState()
  54. const sourceText = dialog.structDefinition || ''
  55. if (!sourceText.trim()) {
  56. if (this.pageToast) this.pageToast.show('请先粘贴结构体定义', 'error')
  57. return
  58. }
  59. const registerType = getOption(this.data.parameterRegisterTypeOptions, dialog.registerTypeIndex)
  60. if (registerType.key === 'coil' || registerType.key === 'discrete') {
  61. if (this.pageToast) this.pageToast.show('结构体解析仅支持寄存器类型', 'error')
  62. return
  63. }
  64. try {
  65. const parsed = parameterGroupService.parseStructDefinition(sourceText)
  66. const inputRegisterIndex = Math.max(
  67. 0,
  68. this.data.parameterRegisterTypeOptions.findIndex((item) => item.key === 'input')
  69. )
  70. const inputRegisterType = getOption(this.data.parameterRegisterTypeOptions, inputRegisterIndex)
  71. this.updateParameterDialog({
  72. groupName: parsed.name || dialog.groupName,
  73. parsedStructRegisters: parsed.registers,
  74. quantity: String(parsed.registers.length),
  75. registerTypeIndex: inputRegisterIndex,
  76. registerTypeText: inputRegisterType.label || '',
  77. structParsedSummary: `${parsed.structName} · ${parsed.registers.length} 个字段`
  78. })
  79. if (this.pageToast) this.pageToast.show('结构体解析完成')
  80. } catch (error) {
  81. if (this.pageToast) this.pageToast.show(error.message || '结构体解析失败', 'error')
  82. }
  83. },
  84. onParameterDraftTypeChange(event) {
  85. const registerTypeIndex = Number(event.detail.value)
  86. const registerType = getOption(this.data.parameterRegisterTypeOptions, registerTypeIndex)
  87. const clearParsedStruct = registerType.key === 'coil' || registerType.key === 'discrete'
  88. this.updateParameterDialog({
  89. ...(clearParsedStruct ? {
  90. parsedStructRegisters: [],
  91. structParsedSummary: ''
  92. } : {}),
  93. registerTypeIndex,
  94. registerTypeText: registerType.label || ''
  95. })
  96. },
  97. onParameterDialogDataTypeChange(event) {
  98. const dataTypeIndex = Number(event.detail.value)
  99. this.updateParameterDialog(getDialogDataTypeState(
  100. this.data.parameterDialog,
  101. this.data.parameterDataTypeOptions,
  102. dataTypeIndex
  103. ))
  104. },
  105. openParameterGroupEdit(event) {
  106. const groupId = event.currentTarget.dataset.groupId
  107. const group = findParameterGroup(getParameterGroupsFromState(this.data), groupId)
  108. if (!group) return
  109. this.parameterGroupLongPressGuard = groupId
  110. this.updateParameterDialog(createParameterGroupDialogState(group))
  111. },
  112. openParameterRegisterInfo(event) {
  113. const groupId = event.currentTarget.dataset.groupId
  114. const registerIndex = Number(event.currentTarget.dataset.index)
  115. const registerKey = `${groupId}:${registerIndex}`
  116. if (this.parameterRegisterLongPressGuard === registerKey) {
  117. this.parameterRegisterLongPressGuard = ''
  118. return
  119. }
  120. const {
  121. group,
  122. register
  123. } = findParameterRegister(getParameterGroupsFromState(this.data), groupId, registerIndex)
  124. if (!register) return
  125. this.updateParameterDialog(createParameterRegisterDialogState('viewRegister', group, register, registerIndex))
  126. },
  127. openParameterRegisterEdit(event) {
  128. const groupId = event.currentTarget.dataset.groupId
  129. const registerIndex = Number(event.currentTarget.dataset.index)
  130. const {
  131. group,
  132. register
  133. } = findParameterRegister(getParameterGroupsFromState(this.data), groupId, registerIndex)
  134. if (!register) return
  135. this.parameterRegisterLongPressGuard = `${groupId}:${registerIndex}`
  136. this.updateParameterDialog(createParameterRegisterDialogState('editRegister', group, register, registerIndex))
  137. },
  138. async confirmParameterDialog() {
  139. const dialog = this.data.parameterDialog || createParameterDialogState()
  140. const mode = dialog.mode
  141. if (mode === 'createGroup') {
  142. const group = parameterGroupService.addGroupFromConfig(createParameterGroupConfig(dialog))
  143. if (group) {
  144. if (this.pageToast) this.pageToast.show(`${group.name}已添加`)
  145. this.closeParameterDraft()
  146. this.setData({
  147. activeParameterGroup: group,
  148. activeParameterGroupId: group.id,
  149. activeParamView: 'parameterGroup',
  150. activeParameterRegisterRows: buildActiveParameterRegisterRows(group, this.parameterRegisterDrag)
  151. })
  152. }
  153. return
  154. }
  155. if (mode === 'editGroup') {
  156. const group = parameterGroupService.updateGroupConfig(dialog.groupId, createParameterGroupConfig(dialog))
  157. if (group) {
  158. if (this.pageToast) this.pageToast.show(`${group.name}已更新`)
  159. this.closeParameterDraft()
  160. if (this.data.activeParameterGroupId === group.id) {
  161. this.setData({
  162. activeParameterGroup: group,
  163. activeParameterRegisterRows: buildActiveParameterRegisterRows(group, this.parameterRegisterDrag)
  164. })
  165. }
  166. }
  167. return
  168. }
  169. if (mode === 'editRegister') {
  170. let changedData
  171. try {
  172. changedData = createParameterRegisterChangedData(dialog, this.data.parameterDataTypeOptions)
  173. } catch (error) {
  174. if (this.pageToast) this.pageToast.show(error.message || '公式无效', 'error')
  175. return
  176. }
  177. parameterGroupService.updateRegister(dialog.groupId, dialog.registerIndex, changedData)
  178. if (this.pageToast) this.pageToast.show(`${dialog.name || '寄存器'}已更新`)
  179. this.closeParameterDraft()
  180. }
  181. }
  182. }
  183. }
  184. module.exports = {
  185. createDialogHandlers
  186. }