Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions packages/amis-core/src/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1553,9 +1553,24 @@ export interface AMISTrackConfig {
* AMIS 加载效果配置
*/
export interface AMISSpinnerConfig {
/**
* 是否显示加载状态
*/
loading?: boolean | AMISSchema;

/**
* 加载效果配置
*/
loadingConfig?: {
root?: string;
show?: boolean;
icon?: string;
tip?: string;
tipPlacement?: 'top' | 'right' | 'bottom' | 'left';
delay?: number;
size?: 'sm' | 'lg' | '';
className?: string;
spinnerClassName?: string;
};
}

Expand Down
7 changes: 4 additions & 3 deletions packages/amis-ui/scss/components/_spinner.scss
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
flex-direction: column;
align-items: center;
justify-content: center;
color: var(--Spinner-color);
opacity: 0;
transition: ease-out opacity var(--animation-duration);

Expand Down Expand Up @@ -53,14 +54,14 @@
.icon {
width: 100%;
height: 100%;
color: var(--Spinner-color);
color: inherit;
}

svg.icon {
top: 0;

path {
fill: var(--Spinner-color);
fill: currentColor;
}
}

Expand Down Expand Up @@ -116,7 +117,7 @@
word-break: keep-all;
white-space: nowrap;
font-size: var(--spinner-base-fontSize);
color: var(--Spinner-color);
color: inherit;
font-weight: var(--spinner-base-fontWeight);
}

Expand Down
37 changes: 27 additions & 10 deletions packages/amis-ui/src/components/Spinner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ export interface SpinnerExtraProps {
loadingConfig?: {
root?: string;
show?: boolean;
icon?: string;
tip?: string;
tipPlacement?: 'top' | 'right' | 'bottom' | 'left';
delay?: number;
size?: 'sm' | 'lg' | '';
className?: string;
spinnerClassName?: string;
};
}

Expand Down Expand Up @@ -110,10 +117,10 @@ export class Spinner extends React.Component<
show: true,
className: '',
spinnerClassName: '',
size: '' as '',
size: '' as const,
icon: '',
tip: '',
tipPlacement: 'bottom' as 'bottom',
tipPlacement: 'bottom' as const,
delay: 0,
overlay: false,
loadingConfig: {},
Expand Down Expand Up @@ -199,17 +206,27 @@ export class Spinner extends React.Component<
renderBody() {
const {
classnames: cx,
className,
spinnerClassName,
size = '',
className: propClassName,
spinnerClassName: propSpinnerClassName,
overlay,
delay,
icon: iconConfig,
tip,
tipPlacement = '',
loadingConfig,
disabled
disabled,
size: propSize,
tip: propTip,
tipPlacement: propTipPlacement,
delay: propDelay,
icon: propIcon
} = this.props;

const size = propSize || loadingConfig?.size || '';
const tip = propTip || loadingConfig?.tip || '';
const tipPlacement = propTipPlacement || loadingConfig?.tipPlacement || '';
const delay = propDelay ?? loadingConfig?.delay ?? 0;
const iconConfig = propIcon || loadingConfig?.icon || '';
const className = propClassName || loadingConfig?.className || '';
const spinnerClassName =
propSpinnerClassName || loadingConfig?.spinnerClassName || '';

// 定义了挂载位置时只能使用默认icon
const icon = loadingConfig?.root ? undefined : iconConfig;
const isCustomIcon = icon && React.isValidElement(icon);
Expand Down
8 changes: 6 additions & 2 deletions packages/amis/src/renderers/CRUD.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3194,7 +3194,11 @@ export default class CRUD<T extends CRUDProps> extends React.Component<T, any> {
headerToolbarRender: this.renderHeaderToolbar,
footerToolbarRender: this.renderFooterToolbar,
data: store.mergedData,
loading: store.loading,
loading: this.props.loading === false ? false : store.loading,
loadingConfig: {
...this.props.loadingConfig,
...(typeof this.props.loading === 'object' ? this.props.loading : {})
},
offset: store.offset,
host: this,
filterItemIndex: this.filterItemIndex,
Expand All @@ -3220,7 +3224,7 @@ export default class CRUD<T extends CRUDProps> extends React.Component<T, any> {
return (
<div
className={cx('Crud', className, {
'is-loading': store.loading,
'is-loading': this.props.loading === false ? false : store.loading,
'is-mobile': mobileUI
})}
style={style}
Expand Down
10 changes: 7 additions & 3 deletions packages/amis/src/renderers/CRUD2.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1741,15 +1741,19 @@ export default class CRUD2<T extends CRUD2Props> extends React.Component<
onAction: this.handleAction,
dispatchEvent: this.dispatchEvent,
data: store.mergedData,
loading: store.loading,
loading: this.props.loading === false ? false : store.loading,
loadingConfig: {
...this.props.loadingConfig,
...(typeof this.props.loading === 'object' ? this.props.loading : {})
},
host: this
}
);

return (
<div
className={cx('Crud2', className, {
'is-loading': store.loading,
'is-loading': this.props.loading === false ? false : store.loading,
'is-mobile': mobileUI,
'is-mobile-cards':
mobileMode === 'cards' || mobileModeProps?.type === 'cards'
Expand Down Expand Up @@ -1789,7 +1793,7 @@ export default class CRUD2<T extends CRUD2Props> extends React.Component<
translate={__}
onRefresh={this.handlePullRefresh}
direction={pullRefresh.gestureDirection ?? 'up'}
loading={store.loading}
loading={this.props.loading === false ? false : store.loading}
completed={
!store.loading &&
store.lastPage > 0 &&
Expand Down
21 changes: 18 additions & 3 deletions packages/amis/src/renderers/Table/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ export interface TableProps extends RendererProps, SpinnerExtraProps {
canAccessSuperData?: boolean;
reUseRow?: boolean;
itemBadge?: BadgeObject;
loading?: boolean;
loading?: boolean | any;
autoFillHeight?: boolean | AutoFillHeightObject;
}

Expand Down Expand Up @@ -2959,7 +2959,13 @@ export default class Table<
translate={translate}
dispatchEvent={dispatchEvent}
onEvent={onEvent}
loading={store.loading} // store 的同步较慢,所以统一用 store 来下发,否则会出现 props 和 store 变化触发子节点两次 re-rerender
loading={this.props.loading === false ? false : store.loading}
loadingConfig={{
...loadingConfig,
...(typeof this.props.loading === 'object'
? this.props.loading
: {})
}}
>
{renderItemActions({
store,
Expand All @@ -2969,7 +2975,16 @@ export default class Table<
})}
</TableContent>

<Spinner loadingConfig={loadingConfig} overlay show={store.loading} />
<Spinner
loadingConfig={{
...loadingConfig,
...(typeof this.props.loading === 'object'
? this.props.loading
: {})
}}
overlay
show={this.props.loading === false ? false : store.loading}
/>
</>
);
}
Expand Down
Loading