1
0

dialog-handlers.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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. onParameterDraftSwitchChange(event) {
  53. const field = event.currentTarget.dataset.field
  54. if (!field) return
  55. this.updateParameterDialog({
  56. [field]: !!event.detail.value
  57. })
  58. },
  59. parseParameterStructDefinition() {
  60. const dialog = this.data.parameterDialog || createParameterDialogState()
  61. const sourceText = dialog.structDefinition || ''
  62. if (!sourceText.trim()) {
  63. if (this.pageToast) this.pageToast.show('请先粘贴结构体/枚举定义', 'error')
  64. return
  65. }
  66. const registerType = getOption(this.data.parameterRegisterTypeOptions, dialog.registerTypeIndex)
  67. if (registerType.key === 'coil' || registerType.key === 'discrete') {
  68. if (this.pageToast) this.pageToast.show('结构体解析仅支持寄存器类型', 'error')
  69. return
  70. }
  71. try {
  72. const parsed = parameterGroupService.parseStructDefinition(sourceText)
  73. const inputRegisterIndex = Math.max(
  74. 0,
  75. this.data.parameterRegisterTypeOptions.findIndex((item) => item.key === 'input')
  76. )
  77. const inputRegisterType = getOption(this.data.parameterRegisterTypeOptions, inputRegisterIndex)
  78. this.updateParameterDialog({
  79. groupName: parsed.name || dialog.groupName,
  80. parsedStructRegisters: parsed.registers,
  81. quantity: String(parsed.registers.length),
  82. registerTypeIndex: inputRegisterIndex,
  83. registerTypeText: inputRegisterType.label || '',
  84. structParsedSummary: `${parsed.structName} · ${parsed.registers.length} 个字段`
  85. })
  86. if (this.pageToast) this.pageToast.show('结构体/枚举解析完成')
  87. } catch (error) {
  88. if (this.pageToast) this.pageToast.show(error.message || '结构体/枚举解析失败', 'error')
  89. }
  90. },
  91. onParameterDraftTypeChange(event) {
  92. const registerTypeIndex = Number(event.detail.value)
  93. const registerType = getOption(this.data.parameterRegisterTypeOptions, registerTypeIndex)
  94. const clearParsedStruct = registerType.key === 'coil' || registerType.key === 'discrete'
  95. this.updateParameterDialog({
  96. ...(clearParsedStruct ? {
  97. parsedStructRegisters: [],
  98. structParsedSummary: ''
  99. } : {}),
  100. registerTypeIndex,
  101. registerTypeText: registerType.label || ''
  102. })
  103. },
  104. onParameterDialogDataTypeChange(event) {
  105. const dataTypeIndex = Number(event.detail.value)
  106. this.updateParameterDialog(getDialogDataTypeState(
  107. this.data.parameterDialog,
  108. this.data.parameterDataTypeOptions,
  109. dataTypeIndex
  110. ))
  111. },
  112. openParameterGroupEdit(event) {
  113. const groupId = event.currentTarget.dataset.groupId
  114. const group = findParameterGroup(getParameterGroupsFromState(this.data), groupId)
  115. if (!group) return
  116. this.parameterGroupLongPressGuard = groupId
  117. this.updateParameterDialog(createParameterGroupDialogState(group))
  118. },
  119. openParameterRegisterInfo(event) {
  120. const groupId = event.currentTarget.dataset.groupId
  121. const registerIndex = Number(event.currentTarget.dataset.index)
  122. const registerKey = `${groupId}:${registerIndex}`
  123. if (this.parameterRegisterLongPressGuard === registerKey) {
  124. this.parameterRegisterLongPressGuard = ''
  125. return
  126. }
  127. const {
  128. group,
  129. register
  130. } = findParameterRegister(getParameterGroupsFromState(this.data), groupId, registerIndex)
  131. if (!register) return
  132. this.updateParameterDialog(createParameterRegisterDialogState('viewRegister', group, register, registerIndex))
  133. },
  134. openParameterRegisterEdit(event) {
  135. const groupId = event.currentTarget.dataset.groupId
  136. const registerIndex = Number(event.currentTarget.dataset.index)
  137. const {
  138. group,
  139. register
  140. } = findParameterRegister(getParameterGroupsFromState(this.data), groupId, registerIndex)
  141. if (!register) return
  142. this.parameterRegisterLongPressGuard = `${groupId}:${registerIndex}`
  143. this.updateParameterDialog(createParameterRegisterDialogState('editRegister', group, register, registerIndex))
  144. },
  145. async confirmParameterDialog() {
  146. const dialog = this.data.parameterDialog || createParameterDialogState()
  147. const mode = dialog.mode
  148. if (mode === 'createGroup') {
  149. const group = parameterGroupService.addGroupFromConfig(createParameterGroupConfig(dialog))
  150. if (group) {
  151. if (this.pageToast) this.pageToast.show(`${group.name}已添加`)
  152. this.closeParameterDraft()
  153. if (this.data.parameterCardControlEnabled === false) {
  154. parameterGroupService.setGroupExpanded(group.id, true)
  155. this.setData({
  156. activeParameterGroup: null,
  157. activeParameterGroupId: '',
  158. activeParamView: 'parameterGroups',
  159. activeParameterRegisterRows: []
  160. })
  161. } else {
  162. this.setData({
  163. activeParameterGroup: group,
  164. activeParameterGroupId: group.id,
  165. activeParamView: 'parameterGroup',
  166. activeParameterRegisterRows: buildActiveParameterRegisterRows(group, this.parameterRegisterDrag)
  167. })
  168. }
  169. }
  170. return
  171. }
  172. if (mode === 'editGroup') {
  173. const group = parameterGroupService.updateGroupConfig(dialog.groupId, createParameterGroupConfig(dialog))
  174. if (group) {
  175. if (this.pageToast) this.pageToast.show(`${group.name}已更新`)
  176. this.closeParameterDraft()
  177. if (this.data.activeParameterGroupId === group.id) {
  178. this.setData({
  179. activeParameterGroup: group,
  180. activeParameterRegisterRows: buildActiveParameterRegisterRows(group, this.parameterRegisterDrag)
  181. })
  182. }
  183. }
  184. return
  185. }
  186. if (mode === 'editRegister') {
  187. let changedData
  188. try {
  189. changedData = createParameterRegisterChangedData(dialog, this.data.parameterDataTypeOptions)
  190. } catch (error) {
  191. if (this.pageToast) this.pageToast.show(error.message || '公式无效', 'error')
  192. return
  193. }
  194. parameterGroupService.updateRegister(dialog.groupId, dialog.registerIndex, changedData)
  195. if (this.pageToast) this.pageToast.show(`${dialog.name || '寄存器'}已更新`)
  196. this.closeParameterDraft()
  197. }
  198. }
  199. }
  200. }
  201. module.exports = {
  202. createDialogHandlers
  203. }