1
0

dialog-handlers.js 8.6 KB

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