@@ -23,6 +23,7 @@ const tableComponentMethodKeys: (keyof VxeTableMethods)[] = ['clearAll', 'syncDa
2323
2424function createInternalData ( ) : GridInternalData {
2525 return {
26+ uFoot : false
2627 }
2728}
2829
@@ -51,6 +52,7 @@ export default defineVxeComponent({
5152 filterData : [ ] ,
5253 formData : { } ,
5354 sortData : [ ] ,
55+ footerData : [ ] ,
5456 tZindex : 0 ,
5557 tablePage : {
5658 total : 0 ,
@@ -149,21 +151,30 @@ export default defineVxeComponent({
149151 const computeTableExtendProps = computed ( ( ) => {
150152 const rest : Record < string , any > = { }
151153 tableComponentPropKeys . forEach ( ( key ) => {
152- rest [ key ] = props [ key ]
154+ if ( props [ key ] !== undefined ) {
155+ rest [ key ] = props [ key ]
156+ }
153157 } )
154158 return rest
155159 } )
156160
157161 const computeTableProps = computed ( ( ) => {
158- const { seqConfig, pagerConfig, editConfig, proxyConfig } = props
159- const { isZMax, tablePage } = reactData
162+ const { showFooter , seqConfig, pagerConfig, editConfig, proxyConfig } = props
163+ const { isZMax, tablePage, footerData } = reactData
160164 const tableExtendProps = computeTableExtendProps . value
161165 const proxyOpts = computeProxyOpts . value
162166 const pagerOpts = computePagerOpts . value
163167 const isLoading = computeIsLoading . value
164168 const tProps = Object . assign ( { } , tableExtendProps )
169+ if ( showFooter && ! tProps . footerData ) {
170+ // 如果未设置自己的标位数据,则使用代理的
171+ tProps . footerData = footerData
172+ } else if ( proxyOpts . footer && footerData . length ) {
173+ // 如果代理标为数据,且未请求到数据,则用自己的
174+ tProps . footerData = footerData
175+ }
165176 if ( isZMax ) {
166- if ( tableExtendProps . maxHeight ) {
177+ if ( tProps . maxHeight ) {
167178 tProps . maxHeight = '100%'
168179 } else {
169180 tProps . height = '100%'
@@ -423,9 +434,12 @@ export default defineVxeComponent({
423434 reactData . filterData = params . filterList
424435 if ( proxyConfig && isEnableConf ( proxyOpts ) ) {
425436 reactData . tablePage . currentPage = 1
437+ internalData . uFoot = true
426438 $xeGrid . commitProxy ( 'query' ) . then ( ( rest ) => {
427439 $xeGrid . dispatchEvent ( 'proxy-query' , rest , params . $event )
428440 } )
441+ internalData . uFoot = false
442+ updateQueryFooter ( )
429443 }
430444 }
431445 }
@@ -447,9 +461,12 @@ export default defineVxeComponent({
447461 return
448462 }
449463 if ( proxyConfig && isEnableConf ( proxyOpts ) ) {
464+ internalData . uFoot = true
450465 $xeGrid . commitProxy ( 'reload' ) . then ( ( rest ) => {
451466 $xeGrid . dispatchEvent ( 'proxy-query' , { ...rest , isReload : true } , params . $event )
452467 } )
468+ internalData . uFoot = false
469+ updateQueryFooter ( )
453470 }
454471 $xeGrid . dispatchEvent ( 'form-submit' , params , params . $event )
455472 }
@@ -463,9 +480,12 @@ export default defineVxeComponent({
463480 if ( $xeTable ) {
464481 $xeTable . clearScroll ( )
465482 }
483+ internalData . uFoot = true
466484 $xeGrid . commitProxy ( 'reload' ) . then ( ( rest ) => {
467485 $xeGrid . dispatchEvent ( 'proxy-query' , { ...rest , isReload : true } , $event )
468486 } )
487+ internalData . uFoot = false
488+ updateQueryFooter ( )
469489 }
470490 $xeGrid . dispatchEvent ( 'form-reset' , params , $event )
471491 }
@@ -917,14 +937,28 @@ export default defineVxeComponent({
917937 if ( ! proxyInited ) {
918938 reactData . proxyInited = true
919939 if ( proxyOpts . autoLoad !== false ) {
920- nextTick ( ) . then ( ( ) => $xeGrid . commitProxy ( 'initial' ) ) . then ( ( rest ) => {
940+ nextTick ( ) . then ( ( ) => {
941+ internalData . uFoot = true
942+ const rest = $xeGrid . commitProxy ( 'initial' )
943+ internalData . uFoot = false
944+ updateQueryFooter ( )
945+ return rest
946+ } ) . then ( ( rest ) => {
921947 dispatchEvent ( 'proxy-query' , { ...rest , isInited : true } , new Event ( 'initial' ) )
922948 } )
923949 }
924950 }
925951 }
926952 }
927953
954+ const updateQueryFooter = ( ) => {
955+ const proxyOpts = computeProxyOpts . value
956+ const { ajax } = proxyOpts
957+ if ( ajax && ajax . queryFooter ) {
958+ return $xeGrid . commitProxy ( 'queryFooter' )
959+ }
960+ }
961+
928962 const handleGlobalKeydownEvent = ( evnt : KeyboardEvent ) => {
929963 const zoomOpts = computeZoomOpts . value
930964 const isEsc = globalEvents . hasKey ( evnt , GLOBAL_EVENT_KEYS . ESCAPE )
@@ -947,15 +981,15 @@ export default defineVxeComponent({
947981 * @param {String/Object } code 字符串或对象
948982 */
949983 commitProxy ( proxyTarget : string | VxeToolbarPropTypes . ButtonConfig , ...args : any [ ] ) {
950- const { proxyConfig, toolbarConfig, pagerConfig, editRules, validConfig } = props
984+ const { showFooter , proxyConfig, toolbarConfig, pagerConfig, editRules, validConfig } = props
951985 const { tablePage } = reactData
952986 const isActiveMsg = computeIsActiveMsg . value
953987 const isRespMsg = computeIsRespMsg . value
954988 const proxyOpts = computeProxyOpts . value
955989 const pagerOpts = computePagerOpts . value
956990 const toolbarOpts = computeToolbarOpts . value
957- const { beforeQuery, afterQuery, beforeDelete, afterDelete, beforeSave, afterSave, ajax = { } } = proxyOpts
958- const resConfigs = proxyOpts . response || proxyOpts . props || { }
991+ const { beforeQuery, afterQuery, beforeQueryFooter , afterQueryFooter , beforeDelete, afterDelete, beforeSave, afterSave, ajax = { } } = proxyOpts
992+ const resConfigs = ( proxyOpts . response || proxyOpts . props || { } ) as VxeGridDefines . ProxyConfigResponseConfig
959993 const $xeTable = refTable . value
960994 if ( ! $xeTable ) {
961995 return nextTick ( )
@@ -1006,10 +1040,10 @@ export default defineVxeComponent({
10061040 case 'initial' :
10071041 case 'reload' :
10081042 case 'query' : {
1009- const ajaxMethods = ajax . query
1010- const querySuccessMethods = ajax . querySuccess
1011- const queryErrorMethods = ajax . queryError
1012- if ( ajaxMethods ) {
1043+ const qMethods = ajax . query
1044+ const qsMethods = ajax . querySuccess
1045+ const qeMethods = ajax . queryError
1046+ if ( qMethods ) {
10131047 const isInited = code === 'initial'
10141048 const isReload = code === 'reload'
10151049 if ( ! isInited && reactData . tableLoading ) {
@@ -1089,32 +1123,44 @@ export default defineVxeComponent({
10891123 sorts : sortList ,
10901124 filters : filterList ,
10911125 form : formData ,
1092- options : ajaxMethods
1126+ options : qMethods
10931127 }
10941128 reactData . sortData = sortList
10951129 reactData . filterData = filterList
10961130 reactData . tableLoading = true
10971131 return Promise . all ( [
1098- Promise . resolve ( ( beforeQuery || ajaxMethods ) ( commitParams , ...args ) ) ,
1132+ Promise . resolve ( ( beforeQuery || qMethods ) ( commitParams , ...args ) ) ,
10991133 operPromise
11001134 ] ) . then ( ( [ rest ] ) => {
11011135 let tableData : any [ ] = [ ]
11021136 reactData . tableLoading = false
11031137 if ( rest ) {
1138+ const reParams = { data : rest , $table : $xeTable , $grid : $xeGrid , $gantt : null }
11041139 if ( pagerConfig && isEnableConf ( pagerOpts ) ) {
11051140 const totalProp = resConfigs . total
1106- const total = ( XEUtils . isFunction ( totalProp ) ? totalProp ( { data : rest , $table : $xeTable , $grid : $xeGrid , $gantt : null } ) : XEUtils . get ( rest , totalProp || 'page.total' ) ) || 0
1141+ const total = ( XEUtils . isFunction ( totalProp ) ? totalProp ( reParams ) : XEUtils . get ( rest , totalProp || 'page.total' ) ) || 0
11071142 tablePage . total = XEUtils . toNumber ( total )
11081143 const resultProp = resConfigs . result
1109- tableData = ( XEUtils . isFunction ( resultProp ) ? resultProp ( { data : rest , $table : $xeTable , $grid : $xeGrid , $gantt : null } ) : XEUtils . get ( rest , resultProp || 'result' ) ) || [ ]
1144+ tableData = ( XEUtils . isFunction ( resultProp ) ? resultProp ( reParams ) : XEUtils . get ( rest , resultProp || 'result' ) ) || [ ]
11101145 // 检验当前页码,不能超出当前最大页数
11111146 const pageCount = Math . max ( Math . ceil ( total / tablePage . pageSize ) , 1 )
11121147 if ( tablePage . currentPage > pageCount ) {
11131148 tablePage . currentPage = pageCount
11141149 }
11151150 } else {
11161151 const listProp = resConfigs . list
1117- tableData = ( listProp ? ( XEUtils . isFunction ( listProp ) ? listProp ( { data : rest , $table : $xeTable , $grid : $xeGrid , $gantt : null } ) : XEUtils . get ( rest , listProp ) ) : rest ) || [ ]
1152+ if ( XEUtils . isArray ( rest ) ) {
1153+ tableData = rest
1154+ } else if ( listProp ) {
1155+ tableData = ( XEUtils . isFunction ( listProp ) ? listProp ( reParams ) : XEUtils . get ( rest , listProp ) ) || [ ]
1156+ }
1157+ }
1158+ if ( showFooter ) {
1159+ const fdProp = resConfigs . footerData
1160+ const footerList = fdProp ? ( XEUtils . isFunction ( fdProp ) ? fdProp ( reParams ) : XEUtils . get ( rest , fdProp ) ) : [ ]
1161+ if ( XEUtils . isArray ( footerList ) ) {
1162+ reactData . footerData = footerList
1163+ }
11181164 }
11191165 }
11201166 if ( $xeTable ) {
@@ -1130,14 +1176,14 @@ export default defineVxeComponent({
11301176 if ( afterQuery ) {
11311177 afterQuery ( commitParams , ...args )
11321178 }
1133- if ( querySuccessMethods ) {
1134- querySuccessMethods ( { ...commitParams , response : rest } )
1179+ if ( qsMethods ) {
1180+ qsMethods ( { ...commitParams , response : rest } )
11351181 }
11361182 return { status : true }
11371183 } ) . catch ( ( rest ) => {
11381184 reactData . tableLoading = false
1139- if ( queryErrorMethods ) {
1140- queryErrorMethods ( { ...commitParams , response : rest } )
1185+ if ( qeMethods ) {
1186+ qeMethods ( { ...commitParams , response : rest } )
11411187 }
11421188 return { status : false }
11431189 } )
@@ -1146,11 +1192,50 @@ export default defineVxeComponent({
11461192 }
11471193 break
11481194 }
1195+ case 'queryFooter' : {
1196+ const qfMethods = ajax . queryFooter
1197+ const qfSuccessMethods = ajax . queryFooterSuccess
1198+ const qfErrorMethods = ajax . queryFooterError
1199+ if ( qfMethods ) {
1200+ let filterList : VxeTableDefines . FilterCheckedParams [ ] = [ ]
1201+ if ( $xeTable ) {
1202+ filterList = $xeTable . getCheckedFilters ( )
1203+ }
1204+ const commitParams = {
1205+ $table : $xeTable ,
1206+ $grid : $xeGrid ,
1207+ $gantt : null ,
1208+ code,
1209+ button,
1210+ filters : filterList ,
1211+ form : formData ,
1212+ options : qfMethods
1213+ }
1214+ return Promise . resolve ( ( beforeQueryFooter || qfMethods ) ( commitParams , ...args ) ) . then ( rest => {
1215+ reactData . footerData = XEUtils . isArray ( rest ) ? rest : [ ]
1216+ if ( afterQueryFooter ) {
1217+ afterQueryFooter ( commitParams , ...args )
1218+ }
1219+ if ( qfSuccessMethods ) {
1220+ qfSuccessMethods ( { ...commitParams , response : rest } )
1221+ }
1222+ return { status : true }
1223+ } ) . catch ( ( rest ) => {
1224+ if ( qfErrorMethods ) {
1225+ qfErrorMethods ( { ...commitParams , response : rest } )
1226+ }
1227+ return { status : false }
1228+ } )
1229+ } else {
1230+ errLog ( 'vxe.error.notFunc' , [ '[grid] proxy-config.ajax.queryFooter' ] )
1231+ }
1232+ break
1233+ }
11491234 case 'delete' : {
1150- const ajaxMethods = ajax . delete
1235+ const dMethods = ajax . delete
11511236 const deleteSuccessMethods = ajax . deleteSuccess
11521237 const deleteErrorMethods = ajax . deleteError
1153- if ( ajaxMethods ) {
1238+ if ( dMethods ) {
11541239 const selectRecords = $xeGrid . getCheckboxRecords ( )
11551240 const removeRecords = selectRecords . filter ( row => ! $xeTable . isInsertByRow ( row ) )
11561241 const body = { removeRecords }
@@ -1162,15 +1247,15 @@ export default defineVxeComponent({
11621247 button,
11631248 body,
11641249 form : formData ,
1165- options : ajaxMethods
1250+ options : dMethods
11661251 }
11671252 if ( selectRecords . length ) {
11681253 return handleDeleteRow ( code , 'vxe.grid.deleteSelectRecord' , ( ) => {
11691254 if ( ! removeRecords . length ) {
11701255 return $xeTable . remove ( selectRecords )
11711256 }
11721257 reactData . tableLoading = true
1173- return Promise . resolve ( ( beforeDelete || ajaxMethods ) ( commitParams , ...args ) )
1258+ return Promise . resolve ( ( beforeDelete || dMethods ) ( commitParams , ...args ) )
11741259 . then ( rest => {
11751260 reactData . tableLoading = false
11761261 $xeTable . setPendingRow ( removeRecords , false )
@@ -1182,7 +1267,10 @@ export default defineVxeComponent({
11821267 if ( afterDelete ) {
11831268 afterDelete ( commitParams , ...args )
11841269 } else {
1270+ internalData . uFoot = true
11851271 $xeGrid . commitProxy ( 'query' )
1272+ internalData . uFoot = false
1273+ updateQueryFooter ( )
11861274 }
11871275 if ( deleteSuccessMethods ) {
11881276 deleteSuccessMethods ( { ...commitParams , response : rest } )
@@ -1263,7 +1351,10 @@ export default defineVxeComponent({
12631351 if ( afterSave ) {
12641352 afterSave ( commitParams , ...args )
12651353 } else {
1354+ internalData . uFoot = true
12661355 $xeGrid . commitProxy ( 'query' )
1356+ internalData . uFoot = false
1357+ updateQueryFooter ( )
12671358 }
12681359 if ( saveSuccessMethods ) {
12691360 saveSuccessMethods ( { ...commitParams , response : rest } )
@@ -1501,11 +1592,23 @@ export default defineVxeComponent({
15011592 } ,
15021593 triggerToolbarCommitEvent ( params , evnt ) {
15031594 const { code } = params
1504- return $xeGrid . commitProxy ( params , evnt ) . then ( ( rest ) => {
1505- if ( code && rest && rest . status && [ 'query' , 'reload' , 'delete' , 'save' ] . includes ( code ) ) {
1506- $xeGrid . dispatchEvent ( code === 'delete' || code === 'save' ? `proxy-${ code as 'delete' | 'save' } ` : 'proxy-query' , { ...rest , isReload : code === 'reload' } , evnt )
1595+ if ( code ) {
1596+ const isUf = [ 'reload' , 'delete' , 'save' ] . includes ( code )
1597+ if ( isUf ) {
1598+ internalData . uFoot = true
15071599 }
1508- } )
1600+ const rest = $xeGrid . commitProxy ( params , evnt ) . then ( ( rest ) => {
1601+ if ( rest && rest . status && [ 'query' , 'reload' , 'delete' , 'save' ] . includes ( code ) ) {
1602+ $xeGrid . dispatchEvent ( code === 'delete' || code === 'save' ? `proxy-${ code as 'delete' | 'save' } ` : 'proxy-query' , { ...rest , isReload : code === 'reload' } , evnt )
1603+ }
1604+ } )
1605+ internalData . uFoot = false
1606+ if ( isUf ) {
1607+ updateQueryFooter ( )
1608+ }
1609+ return rest
1610+ }
1611+ return nextTick ( )
15091612 } ,
15101613 triggerToolbarBtnEvent ( button , evnt ) {
15111614 $xeGrid . triggerToolbarCommitEvent ( button , evnt )
0 commit comments