refactor: result
parent
42916f50f5
commit
3b89f59094
|
@ -1,8 +1,6 @@
|
|||
import { App, defineComponent, inject, VNodeTypes, Plugin } from 'vue';
|
||||
import { App, defineComponent, VNodeTypes, Plugin, ExtractPropTypes, computed } from 'vue';
|
||||
import PropTypes from '../_util/vue-types';
|
||||
import { tuple } from '../_util/type';
|
||||
import { getComponent } from '../_util/props-util';
|
||||
import { defaultConfigProvider } from '../config-provider';
|
||||
import CheckCircleFilled from '@ant-design/icons-vue/CheckCircleFilled';
|
||||
import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled';
|
||||
import ExclamationCircleFilled from '@ant-design/icons-vue/ExclamationCircleFilled';
|
||||
|
@ -10,6 +8,8 @@ import WarningFilled from '@ant-design/icons-vue/WarningFilled';
|
|||
import noFound from './noFound';
|
||||
import serverError from './serverError';
|
||||
import unauthorized from './unauthorized';
|
||||
import useConfigInject from '../_util/hooks/useConfigInject';
|
||||
import classNames from '../_util/classNames';
|
||||
|
||||
export const IconMap = {
|
||||
success: CheckCircleFilled,
|
||||
|
@ -27,7 +27,7 @@ export const ExceptionMap = {
|
|||
// ExceptionImageMap keys
|
||||
const ExceptionStatus = Object.keys(ExceptionMap);
|
||||
|
||||
export const ResultProps = {
|
||||
export const resultProps = {
|
||||
prefixCls: PropTypes.string,
|
||||
icon: PropTypes.any,
|
||||
status: PropTypes.oneOf(tuple('success', 'error', 'info', 'warning', '404', '403', '500')).def(
|
||||
|
@ -38,6 +38,8 @@ export const ResultProps = {
|
|||
extra: PropTypes.any,
|
||||
};
|
||||
|
||||
export type ResultProps = Partial<ExtractPropTypes<typeof resultProps>>;
|
||||
|
||||
const renderIcon = (prefixCls: string, { status, icon }) => {
|
||||
if (ExceptionStatus.includes(`${status}`)) {
|
||||
const SVGComponent = ExceptionMap[status];
|
||||
|
@ -57,31 +59,31 @@ const renderExtra = (prefixCls: string, extra: VNodeTypes) =>
|
|||
|
||||
const Result = defineComponent({
|
||||
name: 'AResult',
|
||||
props: ResultProps,
|
||||
setup() {
|
||||
return {
|
||||
configProvider: inject('configProvider', defaultConfigProvider),
|
||||
};
|
||||
},
|
||||
render() {
|
||||
const { prefixCls: customizePrefixCls, status } = this;
|
||||
const getPrefixCls = this.configProvider.getPrefixCls;
|
||||
const prefixCls = getPrefixCls('result', customizePrefixCls);
|
||||
|
||||
const title = getComponent(this, 'title');
|
||||
const subTitle = getComponent(this, 'subTitle');
|
||||
const icon = getComponent(this, 'icon');
|
||||
const extra = getComponent(this, 'extra');
|
||||
|
||||
return (
|
||||
<div class={`${prefixCls} ${prefixCls}-${status}`}>
|
||||
{renderIcon(prefixCls, { status, icon })}
|
||||
<div class={`${prefixCls}-title`}>{title}</div>
|
||||
{subTitle && <div class={`${prefixCls}-subtitle`}>{subTitle}</div>}
|
||||
{this.$slots.default && <div class={`${prefixCls}-content`}>{this.$slots.default()}</div>}
|
||||
{renderExtra(prefixCls, extra)}
|
||||
</div>
|
||||
props: resultProps,
|
||||
slots: ['title', 'subTitle', 'icon', 'extra'],
|
||||
setup(props, { slots }) {
|
||||
const { prefixCls, direction } = useConfigInject('result', props);
|
||||
const className = computed(() =>
|
||||
classNames(prefixCls.value, `${prefixCls.value}-${props.status}`, {
|
||||
[`${prefixCls.value}-rtl`]: direction.value === 'rtl',
|
||||
}),
|
||||
);
|
||||
return () => {
|
||||
const title = props.title ?? slots.title?.();
|
||||
const subTitle = props.subTitle ?? slots.subTitle?.();
|
||||
const icon = props.icon ?? slots.icon?.();
|
||||
const extra = props.extra ?? slots.extra?.();
|
||||
const pre = prefixCls.value;
|
||||
return (
|
||||
<div class={className.value}>
|
||||
{renderIcon(pre, { status: props.status, icon })}
|
||||
<div class={`${pre}-title`}>{title}</div>
|
||||
{subTitle && <div class={`${pre}-subtitle`}>{subTitle}</div>}
|
||||
{renderExtra(pre, extra)}
|
||||
{slots.default && <div class={`${pre}-content`}>{slots.default()}</div>}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
|
|
|
@ -6,19 +6,19 @@
|
|||
.@{result-prefix-cls} {
|
||||
padding: 48px 32px;
|
||||
// status color
|
||||
&-success &-icon > .anticon {
|
||||
&-success &-icon > .@{iconfont-css-prefix} {
|
||||
color: @success-color;
|
||||
}
|
||||
|
||||
&-error &-icon > .anticon {
|
||||
&-error &-icon > .@{iconfont-css-prefix} {
|
||||
color: @error-color;
|
||||
}
|
||||
|
||||
&-info &-icon > .anticon {
|
||||
&-info &-icon > .@{iconfont-css-prefix} {
|
||||
color: @info-color;
|
||||
}
|
||||
|
||||
&-warning &-icon > .anticon {
|
||||
&-warning &-icon > .@{iconfont-css-prefix} {
|
||||
color: @warning-color;
|
||||
}
|
||||
|
||||
|
@ -33,30 +33,31 @@
|
|||
margin-bottom: 24px;
|
||||
text-align: center;
|
||||
|
||||
> .anticon {
|
||||
font-size: 72px;
|
||||
> .@{iconfont-css-prefix} {
|
||||
font-size: @result-icon-font-size;
|
||||
}
|
||||
}
|
||||
|
||||
&-title {
|
||||
color: @heading-color;
|
||||
font-size: 24px;
|
||||
font-size: @result-title-font-size;
|
||||
line-height: 1.8;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-subtitle {
|
||||
color: @text-color-secondary;
|
||||
font-size: 14px;
|
||||
font-size: @result-subtitle-font-size;
|
||||
line-height: 1.6;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-extra {
|
||||
margin-top: 32px;
|
||||
margin: @result-extra-margin;
|
||||
text-align: center;
|
||||
> * {
|
||||
margin-right: 8px;
|
||||
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
@ -69,3 +70,5 @@
|
|||
background-color: @background-color-light;
|
||||
}
|
||||
}
|
||||
|
||||
@import './rtl';
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
@import '../../style/themes/default';
|
||||
@import '../../style/mixins/index';
|
||||
|
||||
@result-prefix-cls: ~'@{ant-prefix}-result';
|
||||
|
||||
.@{result-prefix-cls} {
|
||||
&-rtl {
|
||||
direction: rtl;
|
||||
}
|
||||
|
||||
&-extra {
|
||||
> * {
|
||||
.@{result-prefix-cls}-rtl & {
|
||||
margin-right: 0;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
.@{result-prefix-cls}-rtl & {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -835,3 +835,10 @@
|
|||
@notification-bg: @component-background;
|
||||
@notification-padding-vertical: 16px;
|
||||
@notification-padding-horizontal: 24px;
|
||||
|
||||
// Result
|
||||
// ---
|
||||
@result-title-font-size: 24px;
|
||||
@result-subtitle-font-size: @font-size-base;
|
||||
@result-icon-font-size: 72px;
|
||||
@result-extra-margin: 24px 0 0 0;
|
||||
|
|
Loading…
Reference in New Issue