From aa90a7e55c809e8b8e1fdc98836bcc7029fcaff7 Mon Sep 17 00:00:00 2001
From: Konv Suu <82451257+kovsu@users.noreply.github.com>
Date: Thu, 12 Jan 2023 15:44:50 +0800
Subject: [PATCH] feat(comp:stepper): add dot prop (#1401)
fix #1082
---
.../components/stepper/__tests__/steps.spec.ts | 9 +++++++++
packages/components/stepper/demo/Dot.md | 14 ++++++++++++++
packages/components/stepper/demo/Dot.vue | 7 +++++++
packages/components/stepper/docs/Api.zh.md | 2 +-
packages/components/stepper/src/StepperItem.tsx | 7 ++++++-
packages/components/stepper/src/types.ts | 4 ++++
packages/components/stepper/style/index.less | 12 ++++++++++++
packages/components/stepper/style/mixin.less | 4 ++++
8 files changed, 57 insertions(+), 2 deletions(-)
create mode 100644 packages/components/stepper/demo/Dot.md
create mode 100644 packages/components/stepper/demo/Dot.vue
diff --git a/packages/components/stepper/__tests__/steps.spec.ts b/packages/components/stepper/__tests__/steps.spec.ts
index c220828b8..875ef2dc0 100644
--- a/packages/components/stepper/__tests__/steps.spec.ts
+++ b/packages/components/stepper/__tests__/steps.spec.ts
@@ -55,6 +55,15 @@ describe('Stepper', () => {
expect(onUpdateActiveKey).toBeCalledTimes(1)
})
+ test('dot work', async () => {
+ const wrapper = StepperMount({ props: { dot: true } })
+ const items = await wrapper.findAll('.ix-stepper-item')
+
+ expect(items[0].classes()).toContain('ix-stepper-item-dot')
+ expect(items[1].classes()).toContain('ix-stepper-item-dot')
+ expect(items[2].classes()).toContain('ix-stepper-item-dot')
+ })
+
test('labelPlacement work', async () => {
const wrapper = StepperMount({ props: { labelPlacement: 'bottom' } })
diff --git a/packages/components/stepper/demo/Dot.md b/packages/components/stepper/demo/Dot.md
new file mode 100644
index 000000000..0bc3f2787
--- /dev/null
+++ b/packages/components/stepper/demo/Dot.md
@@ -0,0 +1,14 @@
+---
+title:
+ zh: 点状步骤条
+ en: Dot Stepper
+order: 10
+---
+
+## zh
+
+点状的步骤条。
+
+## en
+
+The dot style stepper.
diff --git a/packages/components/stepper/demo/Dot.vue b/packages/components/stepper/demo/Dot.vue
new file mode 100644
index 000000000..4fb5432e8
--- /dev/null
+++ b/packages/components/stepper/demo/Dot.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/packages/components/stepper/docs/Api.zh.md b/packages/components/stepper/docs/Api.zh.md
index 1ee1187d9..e1a7cefc9 100644
--- a/packages/components/stepper/docs/Api.zh.md
+++ b/packages/components/stepper/docs/Api.zh.md
@@ -7,7 +7,7 @@
| ---| --- | --- | --- | --- | --- |
`v-model:activeKey` | 当前的激活节点的 `key` | `VKey` | - | - | - |
`clickable` | 是否可点击 | `boolean` | `false` | - | - |
-`dot` | 是否为点状步骤条 | `boolean \| #dot={key, status}` | `false` | - | - |
+`dot` | 是否为点状步骤条 | `boolean` | `false` | - | - |
`labelPlacement` | 指定文本信息放置的位置 | `'end' \| 'bottom'` | `'end'` | -| - |
`percent` | 当前激活节点的进度 | `number` | - | - | 取值是 0-100 |
`size` | 指定节点的大小 | `'md' \| 'sm'` | `'md'` | ✅ | - |
diff --git a/packages/components/stepper/src/StepperItem.tsx b/packages/components/stepper/src/StepperItem.tsx
index 9fa39ad32..d5995caa8 100644
--- a/packages/components/stepper/src/StepperItem.tsx
+++ b/packages/components/stepper/src/StepperItem.tsx
@@ -46,6 +46,8 @@ export default defineComponent({
const classes = computed(() => {
const prefixCls = mergedPrefixCls.value
const { disabled, icon } = props
+ const { dot, labelPlacement } = parentProps
+
return normalizeClass({
[prefixCls]: true,
[`${prefixCls}-${status.value}`]: true,
@@ -53,6 +55,8 @@ export default defineComponent({
[`${prefixCls}-clickable`]: parentProps.clickable && !disabled,
[`${prefixCls}-disabled`]: disabled,
[`${prefixCls}-with-icon`]: icon || !!slots.icon,
+ [`${prefixCls}-dot`]: dot,
+ [`${prefixCls}-label-${labelPlacement}`]: true,
})
})
@@ -66,6 +70,7 @@ export default defineComponent({
return () => {
const prefixCls = mergedPrefixCls.value
const clickable = parentProps.clickable && !props.disabled
+ const { dot } = parentProps
const iconNode = renderIcon(props, slots, parentProps, status, key)
const titleNode = convertStringVNode(slots, props, 'title')
const descriptionNode = convertStringVNode(slots, props, 'description')
@@ -77,7 +82,7 @@ export default defineComponent({
onClick={clickable ? onClick : undefined}
>
- {iconNode}
+ {dot ? '' : iconNode}
{titleNode}
{descriptionNode &&
{descriptionNode}
}
diff --git a/packages/components/stepper/src/types.ts b/packages/components/stepper/src/types.ts
index 96c5e5f64..2fc288c92 100644
--- a/packages/components/stepper/src/types.ts
+++ b/packages/components/stepper/src/types.ts
@@ -34,6 +34,10 @@ export const stepperProps = {
type: Boolean,
default: false,
},
+ dot: {
+ type: Boolean,
+ default: false,
+ },
'onUpdate:activeKey': [Function, Array] as PropType
void>>,
} as const
diff --git a/packages/components/stepper/style/index.less b/packages/components/stepper/style/index.less
index bcb9928e5..fd35ba7e6 100644
--- a/packages/components/stepper/style/index.less
+++ b/packages/components/stepper/style/index.less
@@ -58,6 +58,18 @@
}
}
+ &-label-bottom {
+ .@{stepper-item-prefix}-content {
+ margin-top: -10px;
+ }
+ }
+
+ &-dot {
+ .@{stepper-item-prefix}-icon {
+ transform: scale(0.35) ;
+ }
+ }
+
&-icon {
display: inline-flex;
align-items: center;
diff --git a/packages/components/stepper/style/mixin.less b/packages/components/stepper/style/mixin.less
index 4b4b8fc76..bd47f74fd 100644
--- a/packages/components/stepper/style/mixin.less
+++ b/packages/components/stepper/style/mixin.less
@@ -14,6 +14,10 @@
color: @@icon-color;
}
+ &-@{status}.@{stepper-item-prefix}-dot &-icon {
+ background: @@icon-color;
+ }
+
&-@{status} &-content &-title {
color: @@title-color;
}