HTableForm.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import {createApp, nextTick} from "vue/dist/vue.esm-bundler.js";
  2. import {getTokenHeader} from '~src/api/request/header';
  3. import {toParse, isArray} from "vue-utils-plus";
  4. import HcTableFormUpload from "~com/plugins/table-form/hc-form-upload.vue"
  5. import HcFormSelectSearch from "~com/plugins/table-form/hc-form-select-search.vue"
  6. import HcFormCheckboxGroup from "~com/plugins/table-form/hc-form-checkbox-group.vue"
  7. import {
  8. ElButton, ElTooltip, ElInput, ElDatePicker, ElUpload,
  9. ElInputNumber, ElSelect, ElOption, ElRadioGroup,
  10. ElRadio, ElCheckbox, ElCheckboxGroup, ElTimePicker
  11. } from 'element-plus'
  12. const components = {
  13. ElButton, ElTooltip, ElInput, ElDatePicker, ElUpload,
  14. ElInputNumber, ElTimePicker, ElSelect, ElOption, ElRadioGroup,
  15. ElRadio, ElCheckbox, ElCheckboxGroup, HcTableFormUpload, HcFormSelectSearch,
  16. HcFormCheckboxGroup
  17. }
  18. //表单渲染
  19. export default class HTableForm {
  20. static createForm({template, tableForm, keys, appId, onRight, onBlur}) {
  21. const _this = this;
  22. const app = createApp({
  23. data() {
  24. return {
  25. getTokenHeader: getTokenHeader(),
  26. formData: tableForm,
  27. }
  28. },
  29. //html标签数据
  30. template,
  31. //自定义组件,需要把饿了么的组件,或者自定义组件手动传递进来绑定,否则渲染时,自定义组件不会生效
  32. components,
  33. //监听数据,伪双向绑定(v-model)
  34. watch: {
  35. tableForm: {
  36. handler(obj) {
  37. this.formData = obj
  38. },
  39. deep: true
  40. },
  41. formData: {
  42. handler(obj) {
  43. tableForm = obj
  44. },
  45. deep: true
  46. },
  47. },
  48. methods: {
  49. //鼠标右键事件
  50. RightClick(a, b, c, d, e, f, event) {
  51. event.preventDefault();
  52. const KeyName = event?.target?.getAttribute('keyname') || ''
  53. if (onRight) {
  54. onRight(event, KeyName)
  55. }
  56. },
  57. //焦点事件
  58. getInformation() {
  59. },
  60. //日期选择事件
  61. datePickerChange(val, key) {
  62. this.formData[key] = val
  63. },
  64. //上传完成
  65. formUploadSuccess({src, key}) {
  66. this.formData[key] = src
  67. },
  68. //删除上传的文件
  69. delTableFormFile(key) {
  70. this.formData[key] = ''
  71. },
  72. //失去焦点事件
  73. getRegularExpression(event, reg, msg, a, b, leng) {
  74. const KeyName = event?.target?.getAttribute('keyname') || ''
  75. if (onBlur) {
  76. onBlur(event, KeyName, reg, this.formData[KeyName], msg, leng)
  77. }
  78. },
  79. //远程搜索处理
  80. formRemoteChange(data) {
  81. Object.keys(data).forEach(key => {
  82. this.formData[key] = data[key]
  83. })
  84. },
  85. //多选框处理
  86. checkboxGroupChange({key, val}) {
  87. this.formData[key] = val
  88. },
  89. //键盘事件 上键
  90. keyupShiftUp(event) {
  91. _this.setKeyupData(event, 'up', keys)
  92. },
  93. //键盘事件 下键
  94. keyupShiftDown(event) {
  95. _this.setKeyupData(event, 'down', keys)
  96. },
  97. //键盘事件 左键
  98. keyupShiftLeft(event) {
  99. _this.setKeyupData(event, 'left', keys)
  100. },
  101. //键盘事件 右键
  102. keyupShiftRight(event) {
  103. _this.setKeyupData(event, 'right', keys)
  104. },
  105. }
  106. })
  107. app.mount(appId)
  108. return app
  109. }
  110. //处理日期范围数据
  111. static setPickerKey(data) {
  112. const pickerKey = data['pickerKey'] || ''
  113. if (pickerKey) {
  114. const pickerKeys = pickerKey.split(',')
  115. for (let i = 0; i < pickerKeys.length; i++) {
  116. const val = data[pickerKeys[i]] || ''
  117. if (val) {
  118. const dataVal = val.replace(/'/g, '"');
  119. data[pickerKeys[i]] = toParse(dataVal) || []
  120. } else {
  121. data[pickerKeys[i]] = []
  122. }
  123. }
  124. }
  125. return data
  126. }
  127. //处理日期时间框的切换事件
  128. static setByClassKeyup(keys) {
  129. try {
  130. let poppers = document.getElementsByClassName('hc-table-form-date-picker')
  131. for (let i = 0; i < poppers.length; i++) {
  132. let item = poppers[i], key = '';
  133. const ids = item.getAttribute('class').split('-form-id-')
  134. if (ids.length >= 1) {
  135. key = ids[1]
  136. }
  137. if (ids) {
  138. let panels = item.getElementsByClassName('el-picker-panel__content')
  139. this.setElementsEvent(panels, key, keys)
  140. }
  141. }
  142. } catch (e) {
  143. console.log(e)
  144. }
  145. }
  146. //设置事件
  147. static setElementsEvent(elements, key, keys) {
  148. if (elements.length > 0) {
  149. const _this = this;
  150. elements[0].addEventListener("keydown", e => {
  151. e.stopPropagation()
  152. if (e.key === 'ArrowUp') {
  153. _this.setKeyupData({target: {id: key}}, 'up', keys)
  154. } else if (e.key === 'ArrowDown') {
  155. _this.setKeyupData({target: {id: key}}, 'down', keys)
  156. } else if (e.key === 'ArrowLeft') {
  157. _this.setKeyupData({target: {id: key}}, 'left', keys)
  158. } else if (e.key === 'ArrowRight') {
  159. _this.setKeyupData({target: {id: key}}, 'right', keys)
  160. }
  161. }, {
  162. capture: true
  163. });
  164. }
  165. }
  166. //计算上下左右快捷键的
  167. static setKeyupData({target}, type, keys) {
  168. const key = target.id
  169. //处理快捷键数据和事件
  170. if (key && type && isArray(keys)) {
  171. //计算当前的位置
  172. let left = -1, top = -1;
  173. for (let i = 0; i < keys.length; i++) {
  174. if (isArray(keys[i])) {
  175. const index = keys[i].findIndex(id => id === key)
  176. if (index !== -1) {
  177. left = index
  178. top = i
  179. break;
  180. }
  181. }
  182. }
  183. if (type === 'up') {
  184. //向上移动
  185. if (top > 0) {
  186. let keyId = '';
  187. const tops = keys[top - 1]
  188. const keyLength = tops.length - 1;
  189. if (keyLength < left) {
  190. keyId = tops[keyLength]
  191. } else {
  192. keyId = tops[left]
  193. }
  194. this.setElementFocus(keyId)
  195. }
  196. } else if (type === 'down') {
  197. //向下移动
  198. const tops = keys.length - 1;
  199. if (tops > top) {
  200. let keyId = '';
  201. const tops = keys[top + 1]
  202. const keyLength = tops.length - 1;
  203. if (keyLength < left) {
  204. keyId = tops[keyLength]
  205. } else {
  206. keyId = tops[left]
  207. }
  208. this.setElementFocus(keyId)
  209. }
  210. } else if (type === 'left') {
  211. //向左移动
  212. if (left > 0) {
  213. const keyId = keys[top][left - 1]
  214. this.setElementFocus(keyId)
  215. }
  216. } else if (type === 'right') {
  217. //向右移动
  218. const lefts = keys[top]
  219. const leftLength = lefts.length - 1;
  220. if (leftLength > left) {
  221. const keyId = lefts[left + 1]
  222. this.setElementFocus(keyId)
  223. }
  224. }
  225. }
  226. }
  227. //设置元素焦点
  228. static setElementFocus(keyId) {
  229. if (keyId) {
  230. try {
  231. console.log('focus', keyId)
  232. document.getElementById(keyId).focus();
  233. } catch (e) {
  234. console.log(e)
  235. }
  236. }
  237. }
  238. }