stores.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import _ from 'lodash'
  2. import {lookupScope, lookupFn} from "../lib/lib";
  3. import {serverInvokeUrlTransform, apiConvert} from "../lib/config";
  4. import {calcObjectFlat} from '../lib/systemLib'
  5. /**
  6. * 构建一个 grid 支持的 dataSource
  7. */
  8. export function gridInvokeBuild(scope, grid, config, dataSource, reloadParams = {}) {
  9. const me = grid
  10. const params = calcObjectFlat(scope.viewModel.data, dataSource.params)
  11. let storeOption = {}
  12. if (dataSource.method === 'invoke') {
  13. // 默认支持 gridInvoke
  14. storeOption = {
  15. remoteSort: config.remoteSort,
  16. remoteFilter: config.remoteFilter,
  17. autoLoad: true,
  18. proxy: {
  19. type: 'jsonAjax',
  20. $owner: me,
  21. url: serverInvokeUrlTransform(dataSource.url),
  22. extraParams: _.defaultsDeep({}, reloadParams, params),
  23. reader: {
  24. type: 'json',
  25. rootProperty: 'data',
  26. totalProperty: 'pagination.total',
  27. successProperty: 'success',
  28. messageProperty: 'msg',
  29. transform: function (data) {
  30. if (grid.dataTransform) {
  31. if (typeof grid.dataTransform === 'string') {
  32. grid.dataTransform = lookupFn(lookupScope(grid), grid.dataTransform)
  33. }
  34. return grid.dataTransform.call(scope, grid, data)
  35. }
  36. return data
  37. }
  38. }
  39. },
  40. listeners: {
  41. load: function (store, records, successful, operation) {
  42. me.fireEvent('dataLoadComplete', me, successful, records);
  43. }
  44. }
  45. }
  46. } else if (apiConvert) {
  47. // 外部扩展的 apiConvert
  48. storeOption = apiConvert.gridInvokeBuild(scope, grid, config, dataSource, params, reloadParams)
  49. } else {
  50. throw new TypeError("不支持的 API 请求方式")
  51. }
  52. me.setStore(new Ext.data.Store(storeOption))
  53. }
  54. export default function () {
  55. Ext.define('Yvan.JsonAjaxProxy', {
  56. extend: 'Ext.data.proxy.Ajax',
  57. alias: 'proxy.jsonAjax',
  58. actionMethods: {
  59. create: "POST",
  60. read: "POST",
  61. update: "POST",
  62. destroy: "POST"
  63. },
  64. buildRequest: function (operation) {
  65. // 参考源码 ext-all-debug.js:71468 method:buildRequest
  66. const me = this
  67. const {$owner} = me // 在 grid.initComponent 中赋值 $owner
  68. const scope = lookupScope($owner)
  69. const gridParam = me.getParams(operation)
  70. const customParam = {}
  71. // 提取 srot 元素
  72. if (gridParam.sort) {
  73. const sort = JSON.parse(gridParam.sort)
  74. // 字符串 [{"property":"BRANCHID","direction":"ASC"}]
  75. // 转换为对象 [{colId: "BRANCHID", sort: "asc"}]
  76. customParam.sortModel = []
  77. _.forEach(sort, s => {
  78. customParam.sortModel.push({
  79. colId: s.property,
  80. sort: _.toLower(s.direction)
  81. })
  82. })
  83. delete gridParam.sort
  84. }
  85. // 提取筛选元素
  86. if (gridParam.filter) {
  87. const filter = JSON.parse(gridParam.filter)
  88. // "[{"operator":"like","value":"1","property":"id"}]"
  89. // 转换为 filterModel: {BRANCHID: {filterType: "text", type: "contains", filter: "12"}}
  90. customParam.filterModel = {}
  91. _.forEach(filter, s => {
  92. const newFilterItem = {}
  93. if (s.operator === 'like') {
  94. newFilterItem.filterType = 'text';
  95. newFilterItem.type = 'contains';
  96. newFilterItem.filter = s.value;
  97. } else {
  98. // 无法识别的筛选类型
  99. debugger
  100. }
  101. customParam.filterModel[s.property] = newFilterItem
  102. })
  103. delete gridParam.filter
  104. }
  105. // 被 grid.constructor 作为方法存在
  106. const extraParams = _.cloneDeep(me.getExtraParams())
  107. const params = _.defaultsDeep(gridParam, extraParams)
  108. // var request = this.superclass.buildRequest.apply(this, arguments);
  109. let request = new Ext.data.Request({
  110. params: {},
  111. action: operation.getAction(),
  112. records: operation.getRecords(),
  113. url: me.buildUrl(),
  114. jsonData: {
  115. args: [
  116. params
  117. ],
  118. ...customParam
  119. },
  120. proxy: me
  121. });
  122. operation.setRequest(request);
  123. return request;
  124. },
  125. afterRequest: function (req, res) {
  126. // Extend.afterExtRequest(req, res)
  127. }
  128. });
  129. Ext.define('Ext.ux.data.MyReader', {
  130. extend: 'Ext.data.reader.Json',
  131. xtype: 'yvgridreader',
  132. useSimpleAccessors: false,
  133. // 重写解析 data 的方法
  134. // extractData: function (data) {
  135. // // callParent 要换写成 this.superclass.XXX.call(this, ...)
  136. // // return me.callParent([data]);
  137. //
  138. // if (this.metaData && Ext.isArray(this.metaData.fields)) {
  139. // // data : [][] 换写成数组
  140. // data = _.map(data, row => {
  141. // const newRow = {}
  142. // for (var i = 0; i < this.metaData.fields.length; i++) {
  143. // newRow[this.metaData.fields[i]] = row[i]
  144. // }
  145. // return newRow
  146. // })
  147. // }
  148. //
  149. // const rr = this.superclass.extractData.call(this, data);
  150. // return rr;
  151. // }
  152. });
  153. }