diff --git a/src/control/list/list-render-util.tsx b/src/control/list/list-render-util.tsx index 10c3834a57c97dfa08e4f5cad48af51e30227e95..14796f9c4c7d8d7af61c09bd3cb59968f92943a4 100644 --- a/src/control/list/list-render-util.tsx +++ b/src/control/list/list-render-util.tsx @@ -25,7 +25,7 @@ export function useListRender( ): { renderItem: (row: IData) => VNode | undefined; renderNoData: () => VNode | undefined; - renderLoadMore: () => VNode | undefined; + renderLoadMore: () => JSX.Element | null; } { const isSelect = (row: IData) => { const findIndex = c.state.selectedData.findIndex(data => { @@ -126,10 +126,8 @@ export function useListRender( ); }; - const renderLoadMore = (): VNode | undefined => { - if (props.loadMode === 'auto' || c.state.total <= c.state.items.length) { - return; - } + // 加载更多 + const loadMoreIcon = () => { return (
c.loadMore()}> {ibiz.i18n.t('control.common.loadMore')} @@ -137,5 +135,16 @@ export function useListRender( ); }; + // 分页模式为点击加载时并且当前数量小于总数 + const renderLoadMore = () => { + let icon = null; + const loadMore = + c.state.items.length < c.state.total && c.state.total > c.state.size; + if (loadMore) { + icon = loadMoreIcon(); + } + return icon; + }; + return { renderNoData, renderItem, renderLoadMore }; } diff --git a/src/control/list/md-ctrl/md-ctrl.scss b/src/control/list/md-ctrl/md-ctrl.scss index 63504379f9c4c71088a5d9217e706179438a831b..a95c874edc6f71354710c3d12116bd9961b0f068 100644 --- a/src/control/list/md-ctrl/md-ctrl.scss +++ b/src/control/list/md-ctrl/md-ctrl.scss @@ -15,10 +15,11 @@ $control-mobmdctrl: ( font-size: getCssVar(font-size, header-5), right-icon-margin-right: rem(21px), simplelist-height: 250px, - select-item-padding-bottom: getCssVar(spacing,tight), - select-item-margin: getCssVar(spacing,tight) 0 0 getCssVar(spacing,tight), - select-item-check-padding: getCssVar(spacing,extra-tight), - select-item-gap: getCssVar(spacing,tight), + select-item-padding-bottom: getCssVar(spacing, tight), + select-item-margin: getCssVar(spacing, tight) 0 0 getCssVar(spacing, tight), + select-item-check-padding: getCssVar(spacing, extra-tight), + select-item-gap: getCssVar(spacing, tight), + pagination-height: var(--van-pagination-height), ); @include b(control-mobmdctrl) { @@ -28,13 +29,25 @@ $control-mobmdctrl: ( height: 100%; - .van-list { + @include e(content) { + display: flex; + flex-wrap: wrap; + width: 100%; height: 100%; + padding: getCssVar(control-mobmdctrl, padding); + overflow: hidden auto; .van-cell { padding: getCssVar(control-mobmdctrl, padding); } } + + + @include when(enable-page) { + .#{bem(control-mobmdctrl, content)} { + height: calc(100% - getCssVar(control-mobmdctrl, pagination-height)); + } + } .van-cell__right-icon { margin-right: getCssVar(control-mobmdctrl, right-icon-margin-right); @@ -48,10 +61,10 @@ $control-mobmdctrl: ( .van-cell::after { width: 100%; } +} - @include b(control-panel) { - height: auto; - } +@include b(control-panel) { + height: auto; } @include b(control-mobmdctrl-item) { @@ -66,14 +79,15 @@ $control-mobmdctrl: ( } padding: 0.875rem 0; + &::after { - content: ''; position: relative; - display: block; bottom: -0.875rem; left: 1rem; - height: rem(1px); + display: block; width: calc(100% - 2rem); + height: rem(1px); + content: ''; background-color: getCssVar(color, border); } } @@ -103,6 +117,7 @@ $control-mobmdctrl: ( span { padding: getCssVar(spacing, extra, tight) getCssVar(spacing, base); + cursor: pointer; border: 1px solid getCssVar(color, border); border-radius: getCssVar(border, radius, full); } @@ -110,10 +125,11 @@ $control-mobmdctrl: ( @include b(control-mobmdctrl-select-item) { display: flex; - margin: getCssVar(control-mobmdctrl, select-item-margin); gap: getCssVar(control-mobmdctrl, select-item-gap); - border-bottom: 1px solid getCssVar(color, border); padding-bottom: getCssVar(control-mobmdctrl, select-item-padding-bottom); + margin: getCssVar(control-mobmdctrl, select-item-margin); + border-bottom: 1px solid getCssVar(color, border); + > .van-checkbox { padding: getCssVar(control-mobmdctrl, select-item-check-padding); } diff --git a/src/control/list/md-ctrl/md-ctrl.tsx b/src/control/list/md-ctrl/md-ctrl.tsx index bd8db913d2720eb12920a7cff4d08f006ac06a31..b2398e4bb66ad3cfced47435d8dfd3c2119312e8 100644 --- a/src/control/list/md-ctrl/md-ctrl.tsx +++ b/src/control/list/md-ctrl/md-ctrl.tsx @@ -1,9 +1,10 @@ import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; -import { defineComponent, PropType } from 'vue'; +import { computed, defineComponent, PropType } from 'vue'; import { IDEMobMDCtrl, IUIActionGroup } from '@ibiz/model-core'; import { IMobMDCtrlRowState, MDCtrlController } from '@ibiz-template/runtime'; import './md-ctrl.scss'; import { useListRender } from '../list-render-util'; +import { usePagination } from '../../../util'; export const MDCtrlControl = defineComponent({ name: 'IBizMDCtrlControl', @@ -31,7 +32,6 @@ export const MDCtrlControl = defineComponent({ singleSelect: { type: Boolean, default: true }, selectedData: { type: Object as PropType, required: false }, mode: { type: String, default: 'LIST' }, - loadMode: { type: String, default: 'auto' }, loadDefault: { type: Boolean, default: true }, }, setup(props) { @@ -43,20 +43,44 @@ export const MDCtrlControl = defineComponent({ ns, ); + // 不分页 0 分页栏 1 滚动加载 2 加载更多 3 + // 是否可以加载更多 + const isLodeMoreDisabled = computed(() => { + if (c.model.enablePagingBar === true) { + return true; + } + if (c.model.pagingMode !== 2) { + return true; + } + return ( + c.state.items.length >= c.state.total || + c.state.isLoading || + c.state.total <= c.state.size + ); + }); + + const { onPageChange } = usePagination(c); + + // 是否显示数据伸缩图标 + // 如果未开启分组,并且加载模式为【加载更多】,并且已经加载过一次更多,则为 true + const showCollapseOrExpandIcon = computed(() => { + return !c.model.enableGroup && c.model.pagingMode === 3; + }); + // 左滑界面行为组 const leftSlidingActionGroup = c.model.deuiactionGroup; // 右滑界面行为组 const rightSlidingActionGroup = c.model.deuiactionGroup2; // 绘制滑动行为组 - const renderSlidingActionGroup = ( - group: IUIActionGroup, - row: IMobMDCtrlRowState, - ) => { + const renderSlidingActionGroup = (group: IUIActionGroup, data: IData) => { const groupDetails = group.uiactionGroupDetails || []; if (!groupDetails || groupDetails.length === 0) { return null; } + const row = c.state.rows.find( + (rowData: IMobMDCtrlRowState) => data.srfkey === rowData.data.srfkey, + )!; const btnContainer = row.uaColStates[group.id!]; return groupDetails.map(detail => { const btn = btnContainer[detail.id!]; @@ -76,32 +100,32 @@ export const MDCtrlControl = defineComponent({ }; // 绘制默认列表项 - const renderDefaultItem = (row: IMobMDCtrlRowState) => { + const renderDefaultItem = (data: IData) => { const isItemSliding = !!( leftSlidingActionGroup || rightSlidingActionGroup ); if (isItemSliding) { return ( - + {{ left: rightSlidingActionGroup - ? () => renderSlidingActionGroup(rightSlidingActionGroup, row) + ? () => renderSlidingActionGroup(rightSlidingActionGroup, data) : null, right: leftSlidingActionGroup - ? () => renderSlidingActionGroup(leftSlidingActionGroup, row) + ? () => renderSlidingActionGroup(leftSlidingActionGroup, data) : null, default: () => { - return renderItem(row.data); + return renderItem(data); }, }} ); } - return renderItem(row.data); + return renderItem(data); }; const renderDefault = () => { - return c.state.rows.map(item => { + return c.state.items.map((item: IData) => { return renderDefaultItem(item); }); }; @@ -123,16 +147,12 @@ export const MDCtrlControl = defineComponent({ const renderMDContent = () => { return ( 1 && - ibiz.i18n.t('control.list.end') - } - onLoad={props.loadMode === 'auto' ? () => c.loadMore() : undefined} + class={[ns.e('content')]} + finished={isLodeMoreDisabled.value} + immediate-check={false} + onLoad={() => c.loadMore()} > {c.model.groupMode !== 'NONE' ? renderGroup() : renderDefault()} - {renderLoadMore()} ); }; @@ -142,15 +162,40 @@ export const MDCtrlControl = defineComponent({ ns, renderMDContent, renderNoData, + showCollapseOrExpandIcon, + onPageChange, + renderLoadMore, }; }, render() { + const enablePagingBar = + this.c.model.enablePagingBar && this.c.model.pagingMode === 1; return ( - + {this.c.state.isCreated && (this.c.state.rows.length > 0 ? this.renderMDContent() : this.renderNoData())} + {enablePagingBar ? ( + + ) : null} + {this.showCollapseOrExpandIcon && this.renderLoadMore()} ); }, diff --git a/src/editor/data-picker/picker-editor.controller.ts b/src/editor/data-picker/picker-editor.controller.ts index d30728e35739e1cfc5de9ea0344c31376236e6df..d81d30f209393647a52e5242496a9f74a319a59e 100644 --- a/src/editor/data-picker/picker-editor.controller.ts +++ b/src/editor/data-picker/picker-editor.controller.ts @@ -251,12 +251,14 @@ export class PickerEditorController extends EditorController { ); } // 模态打开视图 + const appView = await ibiz.hub.config.view.get(this.pickupView.id); + const { openMode = 'POPUPMODAL' } = appView; const res = await ibiz.commands.execute( OpenAppViewCommand.TAG, this.pickupView.id, context, params, - { openMode: 'POPUPMODAL' }, + openMode, ); if (res && res.ok && res.data) { return res.data; diff --git a/src/view-engine/mob-md-view-engine.ts b/src/view-engine/mob-md-view-engine.ts index eb2eaa063ec25ecdb8a1236f73a11b6359193140..ad42924b8b153d7324b60a52db88426f4b2a17bc 100644 --- a/src/view-engine/mob-md-view-engine.ts +++ b/src/view-engine/mob-md-view-engine.ts @@ -67,10 +67,6 @@ export class MobMDViewEngine extends MDViewEngine { async onCreated(): Promise { await super.onCreated(); - - if (this.xdataControlName && this.view.model.viewType === 'DEMOBMDVIEW9') { - this.view.slotProps[this.xdataControlName].loadMode = 'click'; - } } /**