Skip to content

Commit 5bc17f0

Browse files
committed
feat: cascader add status & showCheckedStrategy
1 parent dbe7fe7 commit 5bc17f0

File tree

7 files changed

+64
-12
lines changed

7 files changed

+64
-12
lines changed

components/cascader/demo/multiple.vue

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,32 @@ title:
1616
Select multiple options
1717
</docs>
1818
<template>
19-
<a-cascader
20-
v-model:value="value"
21-
style="width: 100%"
22-
multiple
23-
max-tag-count="responsive"
24-
:options="options"
25-
placeholder="Please select"
26-
></a-cascader>
19+
<a-space direction="vertical" style="width: 100%">
20+
<h4>Cascader.SHOW_PARENT</h4>
21+
<a-cascader
22+
v-model:value="value"
23+
style="width: 100%"
24+
multiple
25+
max-tag-count="responsive"
26+
:options="options"
27+
placeholder="Please select"
28+
></a-cascader>
29+
<h4>Cascader.SHOW_CHILD</h4>
30+
<a-cascader
31+
v-model:value="value"
32+
style="width: 100%"
33+
multiple
34+
max-tag-count="responsive"
35+
:options="options"
36+
placeholder="Please select"
37+
:show-checked-strategy="Cascader.SHOW_CHILD"
38+
></a-cascader>
39+
</a-space>
2740
</template>
2841
<script lang="ts">
2942
import { defineComponent, ref } from 'vue';
3043
import type { CascaderProps } from 'ant-design-vue';
44+
import { Cascader } from 'ant-design-vue';
3145
const options: CascaderProps['options'] = [
3246
{
3347
label: 'Light',
@@ -66,6 +80,7 @@ export default defineComponent({
6680
return {
6781
value: ref<string[]>([]),
6882
options,
83+
Cascader,
6984
};
7085
},
7186
});

components/cascader/index.en-US.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ Cascade selection box.
4747
| searchValue | Set search value,Need work with `showSearch` | string | - | 3.0 |
4848
| showSearch | Whether show search input in single mode. | boolean \| [object](#showsearch) | false | |
4949
| size | input size | `large` \| `default` \| `small` | `default` | |
50+
| status | Set validation status | 'error' \| 'warning' | - | 3.3.0 |
5051
| suffixIcon | The custom suffix icon | string \| VNode \| slot | - | |
52+
| showCheckedStrategy | The way show selected item in box. ** `SHOW_CHILD`: ** just show child treeNode. **`Cascader.SHOW_PARENT`:** just show parent treeNode (when all child treeNode under the parent treeNode are checked) | `Cascader.SHOW_PARENT` \| `Cascader.SHOW_CHILD` | `Cascader.SHOW_PARENT` | 3.3.0 |
5153
| tagRender | Customize tag render when `multiple` | slot | - | 3.0 |
5254
| value(v-model) | selected value | string\[] \| number\[] | - | |
5355

components/cascader/index.tsx

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import type { ShowSearchType, FieldNames, BaseOptionType, DefaultOptionType } from '../vc-cascader';
2-
import VcCascader, { cascaderProps as vcCascaderProps } from '../vc-cascader';
2+
import VcCascader, {
3+
cascaderProps as vcCascaderProps,
4+
SHOW_CHILD,
5+
SHOW_PARENT,
6+
} from '../vc-cascader';
37
import RightOutlined from '@ant-design/icons-vue/RightOutlined';
48
import LoadingOutlined from '@ant-design/icons-vue/LoadingOutlined';
59
import LeftOutlined from '@ant-design/icons-vue/LeftOutlined';
@@ -19,6 +23,9 @@ import type { SelectCommonPlacement } from '../_util/transition';
1923
import { getTransitionDirection, getTransitionName } from '../_util/transition';
2024
import { useInjectFormItemContext } from '../form';
2125
import type { ValueType } from '../vc-cascader/Cascader';
26+
import type { InputStatus } from '../_util/statusUtils';
27+
import { getStatusClassNames, getMergedStatus } from '../_util/statusUtils';
28+
import { FormItemInputContext } from '../form/FormItemContext';
2229

2330
// Align the design since we use `rc-select` in root. This help:
2431
// - List search content will show all content
@@ -99,6 +106,7 @@ export function cascaderProps<DataNodeType extends CascaderOptionType = Cascader
99106
bordered: { type: Boolean, default: undefined },
100107
placement: { type: String as PropType<SelectCommonPlacement> },
101108
suffixIcon: PropTypes.any,
109+
status: String as PropType<InputStatus>,
102110
options: Array as PropType<DataNodeType[]>,
103111
'onUpdate:value': Function as PropType<(value: ValueType) => void>,
104112
};
@@ -121,6 +129,8 @@ const Cascader = defineComponent({
121129
}),
122130
setup(props, { attrs, expose, slots, emit }) {
123131
const formItemContext = useInjectFormItemContext();
132+
const formItemInputContext = FormItemInputContext.useInject();
133+
const mergedStatus = computed(() => getMergedStatus(formItemInputContext.status, props.status));
124134
const {
125135
prefixCls: cascaderPrefixCls,
126136
rootPrefixCls,
@@ -234,6 +244,8 @@ const Cascader = defineComponent({
234244
const { suffixIcon, removeIcon, clearIcon } = getIcons(
235245
{
236246
...props,
247+
hasFeedback: formItemInputContext.hasFeedback,
248+
feedbackIcon: formItemInputContext.feedbackIcon,
237249
multiple,
238250
prefixCls: prefixCls.value,
239251
showArrow: mergedShowArrow.value,
@@ -253,7 +265,13 @@ const Cascader = defineComponent({
253265
[`${prefixCls.value}-sm`]: size.value === 'small',
254266
[`${prefixCls.value}-rtl`]: isRtl.value,
255267
[`${prefixCls.value}-borderless`]: !bordered,
268+
[`${prefixCls.value}-in-form-item`]: formItemInputContext.isFormItemInput,
256269
},
270+
getStatusClassNames(
271+
prefixCls.value,
272+
mergedStatus.value,
273+
formItemInputContext.hasFeedback,
274+
),
257275
attrs.class,
258276
]}
259277
direction={direction.value}
@@ -282,7 +300,7 @@ const Cascader = defineComponent({
282300
}}
283301
displayRender={props.displayRender || slots.displayRender}
284302
maxTagPlaceholder={props.maxTagPlaceholder || slots.maxTagPlaceholder}
285-
showArrow={props.showArrow}
303+
showArrow={formItemInputContext.hasFeedback || props.showArrow}
286304
onChange={handleChange}
287305
onBlur={handleBlur}
288306
v-slots={slots}
@@ -292,5 +310,14 @@ const Cascader = defineComponent({
292310
};
293311
},
294312
});
295-
296-
export default withInstall(Cascader);
313+
export default withInstall<
314+
typeof Cascader & {
315+
SHOW_PARENT: typeof SHOW_PARENT;
316+
SHOW_CHILD: typeof SHOW_CHILD;
317+
}
318+
>(
319+
Object.assign(Cascader, {
320+
SHOW_CHILD,
321+
SHOW_PARENT,
322+
} as any),
323+
);

components/cascader/index.zh-CN.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ cover: https://gw.alipayobjects.com/zos/alicdn/UdS8y8xyZ/Cascader.svg
4545
| options | 可选项数据源 | [Option](#option)\[] | - | |
4646
| placeholder | 输入框占位文本 | string | '请选择' | |
4747
| placement | 浮层预设位置 | `bottomLeft` \| `bottomRight` \| `topLeft` \| `topRight` | `bottomLeft` | 3.0 |
48+
| showCheckedStrategy | 定义选中项回填的方式。`Cascader.SHOW_CHILD`: 只显示选中的子节点。`Cascader.SHOW_PARENT`: 只显示父节点(当父节点下所有子节点都选中时)。 | `Cascader.SHOW_PARENT` \| `Cascader.SHOW_CHILD` | `Cascader.SHOW_PARENT` | 3.3.0 |
4849
| removeIcon | 自定义的多选框清除图标 | slot | - | 3.2 |
4950
| searchValue | 设置搜索的值,需要与 `showSearch` 配合使用 | string | - | 3.0 |
5051
| showSearch | 在选择框中显示搜索框 | boolean \| [object](#showsearch) | false | |
52+
| status | 设置校验状态 | 'error' \| 'warning' | - | 3.3.0 |
5153
| size | 输入框大小 | `large` \| `default` \| `small` | `default` | |
5254
| suffixIcon | 自定义的选择框后缀图标 | string \| VNode \| slot | - | |
5355
| tagRender | 自定义 tag 内容,多选时生效 | slot | - | 3.0 |

components/cascader/style/index.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
}
3030

3131
&-menu {
32+
flex-grow: 1;
3233
min-width: 111px;
3334
height: 180px;
3435
margin: 0;

components/cascader/style/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ import './index.less';
44
// style dependencies
55
import '../../empty/style';
66
import '../../select/style';
7+
8+
// deps-lint-skip: form

components/form/demo/index.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<formInModalVue />
2020
<timeRelatedControlsVue />
2121
<validateOtherVue />
22+
<validateStaticVue />
2223
<UseFormBasic />
2324
<UseFormNested />
2425
<UseFormTrigger />
@@ -50,13 +51,15 @@ import UseFormMerge from './useForm-merge.vue';
5051
import CustomizedFormControls from './customized-form-controls.vue';
5152
import timeRelatedControlsVue from './time-related-controls.vue';
5253
import validateOtherVue from './validate-other.vue';
54+
import validateStaticVue from './validate-static.vue';
5355
import CN from '../index.zh-CN.md';
5456
import US from '../index.en-US.md';
5557
5658
export default defineComponent({
5759
US,
5860
CN,
5961
components: {
62+
validateStaticVue,
6063
timeRelatedControlsVue,
6164
validateOtherVue,
6265
Basic,

0 commit comments

Comments
 (0)