|
@@ -0,0 +1,240 @@
|
|
|
+import {ajax} from './lib/config'
|
|
|
+import _ from 'lodash'
|
|
|
+import {lookupFn, lookupScope} from "./lib/lib";
|
|
|
+
|
|
|
+/**
|
|
|
+ * 通用 dataSource 解析,
|
|
|
+ * Tree/Combo/Grid/PageList ... 都会从这里解析
|
|
|
+ */
|
|
|
+export function dataSourceReload(ctl: any, extraParam?: any, _successCb?: Function,
|
|
|
+ successCallback?: (data: any[]) => void,
|
|
|
+ failCallback?: (msg) => void): Promise<any> {
|
|
|
+ const {config} = ctl
|
|
|
+
|
|
|
+ return new Promise<any>((resolve, reject) => {
|
|
|
+ if (!config.dataSource) {
|
|
|
+ // 没有设置数据源,直接置空
|
|
|
+ return Promise.resolve()
|
|
|
+ }
|
|
|
+ const option: DataSourceParam = {
|
|
|
+ extraParam,
|
|
|
+ _successCb,
|
|
|
+ successCallback: (value) => {
|
|
|
+ if (typeof successCallback === "function") {
|
|
|
+ successCallback(value)
|
|
|
+ } else {
|
|
|
+ ctl.setDataReal(value)
|
|
|
+ }
|
|
|
+ ctl.fireEvent('dataLoadComplete', ctl, true, value);
|
|
|
+ ctl.setLoading(false)
|
|
|
+ resolve(value)
|
|
|
+ },
|
|
|
+ failCallback: (error) => {
|
|
|
+ if (typeof failCallback === "function") {
|
|
|
+ failCallback(error)
|
|
|
+ }
|
|
|
+ ctl.fireEvent('dataLoadComplete', ctl, false);
|
|
|
+ ctl.setLoading(false)
|
|
|
+ reject(error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 请求前要求确认一下
|
|
|
+ let isCanceled: boolean = false
|
|
|
+ ctl.fireEvent('dataBeforeLoad', ctl, {
|
|
|
+ cancel: () => {
|
|
|
+ isCanceled = true
|
|
|
+ },
|
|
|
+ ...option
|
|
|
+ });
|
|
|
+
|
|
|
+ if (!isCanceled) {
|
|
|
+ // 请求没有被取消
|
|
|
+ // 调用异步接口返回 Promise
|
|
|
+ return _innerReload(ctl, option)
|
|
|
+ }
|
|
|
+ return reject()
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function _innerReload(ctl: any, option: DataSourceParam) {
|
|
|
+ const {config} = ctl
|
|
|
+ ctl.setLoading(true)
|
|
|
+
|
|
|
+ const scope = lookupScope(ctl)
|
|
|
+ let dataSource = config.dataSource
|
|
|
+ if (typeof dataSource == 'string') {
|
|
|
+ dataSource = lookupFn(scope, config.dataSource)
|
|
|
+ }
|
|
|
+
|
|
|
+ if (typeof dataSource === 'function') {
|
|
|
+ // @ts-ignore
|
|
|
+ dataSource.call(scope, ctl, option)
|
|
|
+ return
|
|
|
+
|
|
|
+ } else if (typeof dataSource?.url === 'string' || typeof dataSource?.sqlId === 'string') {
|
|
|
+
|
|
|
+ if (!ajax.func) {
|
|
|
+ console.error("没有配置 ajax")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const params: any = {}
|
|
|
+ let sortModel: any = null;
|
|
|
+ let filterModel: any = null;
|
|
|
+ if (option.extraParam && option.extraParam.filterModel) {
|
|
|
+ filterModel = option.extraParam.filterModel;
|
|
|
+ }
|
|
|
+ if (option.extraParam && option.extraParam.sortModel) {
|
|
|
+ sortModel = option.extraParam.sortModel;
|
|
|
+ }
|
|
|
+
|
|
|
+ _.forOwn(option.extraParam, (v: any, key) => {
|
|
|
+ if (key != "filterModel" && key != "sortModel") {
|
|
|
+ if (typeof v === 'function') {
|
|
|
+ params[key] = v()
|
|
|
+ } else {
|
|
|
+ params[key] = v
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const ds: DataSourceAjax<any> = dataSource
|
|
|
+
|
|
|
+ _.forOwn(ds.params, (v: any, key) => {
|
|
|
+ if (typeof v === 'function') {
|
|
|
+ params[key] = v()
|
|
|
+ } else {
|
|
|
+ params[key] = v
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ if (typeof dataSource?.url === 'string') {
|
|
|
+ // @ts-ignore
|
|
|
+ ajax.func({
|
|
|
+ method: dataSource.method,
|
|
|
+ url: ds.url,
|
|
|
+ data: params,
|
|
|
+ filterModel,
|
|
|
+ sortModel,
|
|
|
+ }).then(res => {
|
|
|
+ if (res.success) {
|
|
|
+ option.successCallback(res.data)
|
|
|
+
|
|
|
+ } else {
|
|
|
+ option.failCallback(res.msg)
|
|
|
+ }
|
|
|
+
|
|
|
+ }).catch(e => {
|
|
|
+ option.failCallback(e)
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ } else if (typeof dataSource?.sqlId === 'string') {
|
|
|
+
|
|
|
+ const ds: DataSourceSql<any> = ctl.dataSource
|
|
|
+
|
|
|
+ // @ts-ignore
|
|
|
+ Extend.ajax.func({
|
|
|
+ url: ds.sqlId,
|
|
|
+ data: params,
|
|
|
+ db: ds.db,
|
|
|
+ method: 'sql',
|
|
|
+ filterModel,
|
|
|
+ sortModel,
|
|
|
+ }).then(res => {
|
|
|
+ if (res.success) {
|
|
|
+ option.successCallback(res.data)
|
|
|
+
|
|
|
+ } else {
|
|
|
+ option.failCallback(res.msg)
|
|
|
+ }
|
|
|
+
|
|
|
+ }).catch(e => {
|
|
|
+ option.failCallback(e)
|
|
|
+
|
|
|
+ }).finally(() => {
|
|
|
+ ctl.loading = false
|
|
|
+ })
|
|
|
+
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+
|
|
|
+ console.error("非法的 dataSource", ctl.dataSource)
|
|
|
+ debugger
|
|
|
+ throw new Error("非法的 dataSource")
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export interface DataSourceParam {
|
|
|
+ /**
|
|
|
+ * 额外附加的参数
|
|
|
+ */
|
|
|
+ extraParam?: any
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 成功后额外的调用
|
|
|
+ */
|
|
|
+ _successCb?: Function
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置响应成功的数据
|
|
|
+ */
|
|
|
+ successCallback: (data: any[]) => void
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置响应失败
|
|
|
+ * @param msg 错误消息(可以为空)
|
|
|
+ */
|
|
|
+ failCallback: (msg?: string) => void
|
|
|
+}
|
|
|
+
|
|
|
+export interface DataSourceBefore extends DataSourceParam {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取消下一步的请求
|
|
|
+ */
|
|
|
+ cancel: () => void
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 方法作为数据源
|
|
|
+ */
|
|
|
+export type DataSourceFunction<T> = (sender: T, option: DataSourceParam) => void
|
|
|
+
|
|
|
+/**
|
|
|
+ * Ajax 数据源
|
|
|
+ */
|
|
|
+export interface DataSourceAjax<T> {
|
|
|
+ url: string,
|
|
|
+ method: string,
|
|
|
+ params?: {
|
|
|
+ [key: string]: (() => any) | any
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Sql 数据源
|
|
|
+ */
|
|
|
+export interface DataSourceSql<T> {
|
|
|
+ sqlId: string,
|
|
|
+ db: string,
|
|
|
+ params?: {
|
|
|
+ [key: string]: (() => any) | any
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 数据源配置
|
|
|
+ */
|
|
|
+export type DataSourceHelper<T> = DataSourceFunction<T> | DataSourceAjax<T> | DataSourceSql<T>
|
|
|
+
|
|
|
+/**
|
|
|
+ * 数据抽取之前的设置
|
|
|
+ */
|
|
|
+export type OnBeforeDataLoad<T> = (sender: T, option: DataSourceBefore) => void
|
|
|
+
|
|
|
+/**
|
|
|
+ * 数据加载完成之后的回调
|
|
|
+ */
|
|
|
+export type OnDataLoadComplete<T> = (sender: T) => void
|