123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- import _ from 'lodash'
- import {lookupScope, lookupFn} from "../lib/lib";
- import {serverInvokeUrlTransform, apiConvert} from "../lib/config";
- import {calcObjectFlat} from '../lib/systemLib'
- /**
- * 构建一个 grid 支持的 dataSource
- */
- export function gridInvokeBuild(scope, grid, config, dataSource, reloadParams = {}, isExcelExport = false, excelExportCallBack = null) {
- const me = grid
- const params = calcObjectFlat(scope.viewModel.data, dataSource.params)
- let storeOption = {}
- if (dataSource.method === 'invoke') {
- // 默认支持 gridInvoke
- storeOption = {
- remoteSort: config.remoteSort,
- remoteFilter: config.remoteFilter,
- autoLoad: true,
- proxy: {
- type: 'jsonAjax',
- $owner: me,
- url: serverInvokeUrlTransform(dataSource.url),
- extraParams: _.defaultsDeep({}, reloadParams, params),
- reader: {
- type: 'json',
- rootProperty: 'data',
- totalProperty: 'pagination.total',
- successProperty: 'success',
- messageProperty: 'msg',
- transform: function (data) {
- if (grid.dataTransform) {
- if (typeof grid.dataTransform === 'string') {
- grid.dataTransform = lookupFn(lookupScope(grid), grid.dataTransform)
- }
- return grid.dataTransform.call(scope, grid, data)
- }
- return data
- }
- }
- },
- listeners: {
- load: function (store, records, successful, operation) {
- const rep = operation.getResponse().responseJson
- me.exportExcelTotal = rep.pagination?.total || rep.data?.length || 0
- if (isExcelExport) {
- if (typeof excelExportCallBack === 'function') {
- excelExportCallBack(rep);
- } else if (excelExportCallBack) {
- console.error("导出回调方法错误!")
- }
- me.fireEvent('excelDataLoadComplete', me, successful, records);
- } else {
- me.fireEvent('dataLoadComplete', me, successful, records);
- }
- }
- }
- }
- } else if (apiConvert) {
- // 外部扩展的 apiConvert
- storeOption = apiConvert.gridInvokeBuild(scope, grid, config, dataSource, params, reloadParams)
- } else {
- throw new TypeError("不支持的 API 请求方式")
- }
- if (isExcelExport) {
- const excelStore = new Ext.data.Store(storeOption);
- excelStore.load()
- } else {
- me.setStore(new Ext.data.Store(storeOption))
- }
- }
- export default function () {
- Ext.define('Yvan.JsonAjaxProxy', {
- extend: 'Ext.data.proxy.Ajax',
- alias: 'proxy.jsonAjax',
- actionMethods: {
- create: "POST",
- read: "POST",
- update: "POST",
- destroy: "POST"
- },
- buildRequest: function (operation) {
- // 参考源码 ext-all-debug.js:71468 method:buildRequest
- const me = this
- const {$owner} = me // 在 grid.initComponent 中赋值 $owner
- const scope = lookupScope($owner)
- const gridParam = me.getParams(operation)
- const customParam = {}
- // 提取 srot 元素
- if (gridParam.sort) {
- const sort = JSON.parse(gridParam.sort)
- // 字符串 [{"property":"BRANCHID","direction":"ASC"}]
- // 转换为对象 [{colId: "BRANCHID", sort: "asc"}]
- customParam.sortModel = []
- _.forEach(sort, s => {
- customParam.sortModel.push({
- colId: s.property,
- sort: _.toLower(s.direction)
- })
- })
- delete gridParam.sort
- }
- // 提取筛选元素
- if (gridParam.filter) {
- const filter = JSON.parse(gridParam.filter)
- // "[{"operator":"like","value":"1","property":"id"}]"
- // 转换为 filterModel: {BRANCHID: {filterType: "text", type: "contains", filter: "12"}}
- customParam.filterModel = {}
- _.forEach(filter, s => {
- const newFilterItem = {}
- if (s.operator === 'like') {
- newFilterItem.filterType = 'text';
- newFilterItem.type = 'contains';
- newFilterItem.filter = s.value;
- } else {
- // 无法识别的筛选类型
- debugger
- }
- customParam.filterModel[s.property] = newFilterItem
- })
- delete gridParam.filter
- }
- // 被 grid.constructor 作为方法存在
- const extraParams = _.cloneDeep(me.getExtraParams())
- const params = _.defaultsDeep(gridParam, extraParams)
- // var request = this.superclass.buildRequest.apply(this, arguments);
- let request = new Ext.data.Request({
- params: {},
- action: operation.getAction(),
- records: operation.getRecords(),
- url: me.buildUrl(),
- jsonData: {
- args: [
- params
- ],
- ...customParam
- },
- proxy: me
- });
- operation.setRequest(request);
- return request;
- },
- afterRequest: function (req, res) {
- // Extend.afterExtRequest(req, res)
- }
- });
- Ext.define('Ext.ux.data.MyReader', {
- extend: 'Ext.data.reader.Json',
- xtype: 'yvgridreader',
- useSimpleAccessors: false,
- // 重写解析 data 的方法
- // extractData: function (data) {
- // // callParent 要换写成 this.superclass.XXX.call(this, ...)
- // // return me.callParent([data]);
- //
- // if (this.metaData && Ext.isArray(this.metaData.fields)) {
- // // data : [][] 换写成数组
- // data = _.map(data, row => {
- // const newRow = {}
- // for (var i = 0; i < this.metaData.fields.length; i++) {
- // newRow[this.metaData.fields[i]] = row[i]
- // }
- // return newRow
- // })
- // }
- //
- // const rr = this.superclass.extractData.call(this, data);
- // return rr;
- // }
- });
- }
|