Skip to content

Commit

Permalink
feat(pro:search): add custom icon renderer for treeSelect and cascader
Browse files Browse the repository at this point in the history
add `customExpandIcon` for treeSelect field
add `customDragableIcon` for treeSelect field
add `customExpandIcon` for cascader field
  • Loading branch information
sallerli1 committed May 17, 2023
1 parent 05fdb30 commit 9e66882
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 8 deletions.
3 changes: 3 additions & 0 deletions packages/pro/search/docs/Api.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,9 @@ TreeSelectSearchFieldConfig
| `cascaderStrategy` | 级联策略 | `CascaderStrategy` | - | - | 详情参考[Tree](/components/tree/zh) |
| `draggable` | 是否可拖拽 | `boolean` | - | - | 详情参考[Tree](/components/tree/zh) |
| `draggableIcon` | 拖拽图标 | `string` | - | - | 详情参考[Tree](/components/tree/zh) |
| `customDraggableIcon` | 拖拽图标自定义渲染 | `string \| () => VNodeChild` | - | - | 值为string时为对应名称的插槽 |
| `expandIcon` | 展开收起图标 | `string \| [string, string]` | - | - | 详情参考[Tree](/components/tree/zh) |
| `customExpandIcon` | 展开收起图标自定义渲染 | `string \| (options: { key: VKey, expanded: boolean, node: TreeSelectPanelData }) => VNodeChild` | - | - | 值为string时为对应名称的插槽 |
| `showLine` | 是否展示连线 | `boolean` | - | - | 详情参考[Tree](/components/tree/zh) |
| `searchable` | 是否支持筛选 | `boolean` | `false` | - | 默认不支持 |
| `searchFn` | 搜索函数 | `(node: TreeSelectPanelData, searchValue?: string) => boolean` | - | - | 默认模糊匹配 |
Expand Down
4 changes: 2 additions & 2 deletions packages/pro/search/src/panel/CascaderPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { proSearchCascaderPanelProps } from '../types'

export default defineComponent({
props: proSearchCascaderPanelProps,
setup(props) {
setup(props, { slots }) {
const { mergedPrefixCls, locale } = inject(proSearchContext)!

watch(
Expand Down Expand Up @@ -101,7 +101,7 @@ export default defineComponent({

return (
<div class={prefixCls} tabindex={-1} onMousedown={evt => evt.preventDefault()}>
<IxCascaderPanel {...panelProps} />
<IxCascaderPanel {...panelProps} v-slots={slots} />
{renderFooter()}
</div>
)
Expand Down
4 changes: 2 additions & 2 deletions packages/pro/search/src/panel/TreeSelectPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { type ProSearchTreeSelectPanelProps, type TreeSelectPanelData, proSearch

export default defineComponent({
props: proSearchTreeSelectPanelProps,
setup(props) {
setup(props, { slots }) {
const { mergedPrefixCls, locale } = inject(proSearchContext)!

const mergedCheckable = computed(() => props.multiple && props.checkable)
Expand Down Expand Up @@ -161,7 +161,7 @@ export default defineComponent({

return (
<div class={classes} tabindex={-1} onMousedown={evt => evt.preventDefault()}>
<IxTree class={`${prefixCls}-body`} {...treeProps} />
<IxTree class={`${prefixCls}-body`} {...treeProps} v-slots={slots} />
{renderFooter()}
</div>
)
Expand Down
9 changes: 7 additions & 2 deletions packages/pro/search/src/segments/CreateCascaderSegment.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import type { CascaderPanelData, CascaderSearchField, PanelRenderContext, Segmen

import { ref } from 'vue'

import { isNil, toString } from 'lodash-es'
import { isNil, isString, toString } from 'lodash-es'

import { type VKey, convertArray, traverseTree } from '@idux/cdk/utils'
import { type TreeCheckStateResolver, useTreeCheckStateResolver } from '@idux/components/utils'
Expand All @@ -31,6 +31,7 @@ export function createCascaderSegment(
dataSource,
cascaderStrategy,
expandIcon,
customExpandIcon,
expandTrigger,
fullPath,
pathSeparator,
Expand Down Expand Up @@ -73,16 +74,20 @@ export function createCascaderSegment(
)

const panelRenderer = (context: PanelRenderContext<VKey | (VKey | VKey[])[] | undefined>) => {
const { ok, cancel, renderLocation } = context
const { ok, cancel, slots, renderLocation } = context
const { panelValue, searchInput, handleChange } = getSelectableCommonParams<VKey | VKey[]>(
context,
!!multiple,
renderLocation === 'individual' ? separator ?? defaultSeparator : undefined,
!multiple || renderLocation === 'quick-select-panel',
)
const cascaderPanelSlots = {
expandIcon: isString(customExpandIcon) ? slots[customExpandIcon] : customExpandIcon,
}

return (
<CascaderPanel
v-slots={cascaderPanelSlots}
value={panelValue}
searchValue={searchable && searchInput ? searchInput : undefined}
dataSource={dataSource}
Expand Down
14 changes: 12 additions & 2 deletions packages/pro/search/src/segments/CreateTreeSelectSegment.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import type { PanelRenderContext, Segment, TreeSelectPanelData, TreeSelectSearchField } from '../types'

import { isNil, toString } from 'lodash-es'
import { isNil, isString, toString } from 'lodash-es'

import { type VKey, convertArray, traverseTree } from '@idux/cdk/utils'

Expand All @@ -27,6 +27,9 @@ export function createTreeSelectSegment(
cascaderStrategy,
draggable,
draggableIcon,
customDraggableIcon,
expandIcon,
customExpandIcon,
separator,
showLine,
searchable,
Expand Down Expand Up @@ -58,16 +61,22 @@ export function createTreeSelectSegment(
})

const panelRenderer = (context: PanelRenderContext<VKey | VKey[] | undefined>) => {
const { ok, cancel, renderLocation } = context
const { ok, cancel, slots, renderLocation } = context
const { panelValue, searchInput, handleChange } = getSelectableCommonParams(
context,
!!multiple,
renderLocation === 'individual' ? separator ?? defaultSeparator : undefined,
!multiple || renderLocation === 'quick-select-panel',
)

const treeSelectPanelSlots = {
draggableIcon: isString(customDraggableIcon) ? slots[customDraggableIcon] : customDraggableIcon,
expandIcon: isString(customExpandIcon) ? slots[customExpandIcon] : customExpandIcon,
}

return (
<TreeSelectPanel
v-slots={treeSelectPanelSlots}
value={panelValue}
searchValue={searchable && searchInput ? searchInput : undefined}
autoHeight={renderLocation === 'quick-select-panel'}
Expand All @@ -76,6 +85,7 @@ export function createTreeSelectSegment(
draggableIcon={draggableIcon}
checkable={checkable}
cascaderStrategy={cascaderStrategy}
expandIcon={expandIcon}
multiple={multiple}
virtual={virtual}
showLine={showLine}
Expand Down
4 changes: 4 additions & 0 deletions packages/pro/search/src/types/searchFields.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ interface TreeSelectSearchFieldBase {
cascaderStrategy: CascaderStrategy
draggable?: boolean
draggableIcon?: string
customDraggableIcon?: string | (() => VNodeChild)
expandIcon?: string | [string, string]
customExpandIcon?: string | ((options: { key: VKey; expanded: boolean; node: TreeSelectPanelData }) => VNodeChild)
showLine?: boolean
searchable?: boolean
separator?: string
Expand Down Expand Up @@ -95,6 +98,7 @@ interface CascaderSearchFieldBase {
multiple?: boolean
disableData?: (data: CascaderPanelData) => boolean
expandIcon?: string
customExpandIcon?: string | ((options: { key: VKey; expanded: boolean; data: CascaderPanelData }) => VNodeChild)
expandTrigger?: CascaderExpandTrigger
fullPath?: boolean
pathSeparator?: string
Expand Down

0 comments on commit 9e66882

Please sign in to comment.