Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 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
79 changes: 34 additions & 45 deletions packages/components/cascader/cascader.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { defineComponent, computed } from 'vue';
import { omit } from 'lodash-es';
import Panel from './components/Panel';
import SelectInput from '../select-input';
import FakeArrow from '../common-components/fake-arrow';
Expand All @@ -22,6 +21,7 @@ import {
useReadonly,
usePrefixClass,
useCommonClassName,
useEventForward,
} from '@tdesign/shared-hooks';
import { useCascaderContext } from './hooks';

Expand Down Expand Up @@ -104,6 +104,38 @@ export default defineComponent({
return () => {
const { setVisible, visible, inputVal, setInputVal } = cascaderContext.value;

const selectInputEvents = useEventForward(props.selectInputProps as TdSelectInputProps, {
onTagChange: (val: CascaderValue, ctx) => {
// 按 enter 键不处理
if (ctx.trigger === 'enter') return;
handleRemoveTagEffect(cascaderContext.value, ctx.index, props.onRemove);
},
onInputChange: (value) => {
if (!isFilterable.value) return;
setInputVal(`${value}`);
},
onPopupVisibleChange: (val: boolean, context) => {
if (isDisabled.value) return;
setVisible(val, context);
},
onBlur: (val, context) => {
props.onBlur?.({
value: cascaderContext.value.value,
inputValue: context.inputValue || '',
e: context.e as FocusEvent,
});
},
onFocus: (val, context) => {
props.onFocus?.({
value: cascaderContext.value.value,
e: context.e,
});
},
onClear: () => {
closeIconClickEffect(cascaderContext.value);
},
});

return (
<SelectInput
class={cascaderClassNames.value}
Expand Down Expand Up @@ -142,42 +174,6 @@ export default defineComponent({
...(props.tagInputProps as TdCascaderProps['tagInputProps']),
}}
tagProps={{ ...(props.tagProps as TdCascaderProps['tagProps']) }}
onInputChange={(value, ctx) => {
if (!isFilterable.value) return;
setInputVal(`${value}`);
(props?.selectInputProps as TdSelectInputProps)?.onInputChange?.(value, ctx);
}}
onTagChange={(val: CascaderValue, ctx) => {
// 按 enter 键不处理
if (ctx.trigger === 'enter') return;
handleRemoveTagEffect(cascaderContext.value, ctx.index, props.onRemove);
// @ts-ignore TODO: fix bug
(props?.selectInputProps as TdSelectInputProps)?.onTagChange?.(val, ctx);
}}
onPopupVisibleChange={(val: boolean, context) => {
if (isDisabled.value) return;
setVisible(val, context);
(props?.selectInputProps as TdSelectInputProps)?.onPopupVisibleChange?.(val, context);
}}
onBlur={(val, context) => {
props.onBlur?.({
value: cascaderContext.value.value,
inputValue: context.inputValue || '',
e: context.e as FocusEvent,
});
(props?.selectInputProps as TdSelectInputProps)?.onBlur?.(val, context);
}}
onFocus={(val, context) => {
props.onFocus?.({
value: cascaderContext.value.value,
e: context.e,
});
(props?.selectInputProps as TdSelectInputProps)?.onFocus?.(val, context);
}}
onClear={(context: { e: MouseEvent }) => {
closeIconClickEffect(cascaderContext.value);
(props?.selectInputProps as TdSelectInputProps)?.onClear?.(context);
}}
v-slots={{
label: slots.label,
suffix: slots.suffix,
Expand All @@ -200,14 +196,7 @@ export default defineComponent({
),
collapsedItems: slots.collapsedItems,
}}
{...omit(props.selectInputProps as TdSelectInputProps, [
'onTagChange',
'onInputChange',
'onPopupVisibleChange',
'onBlur',
'onFocus',
'onClear',
])}
{...selectInputEvents}
/>
);
};
Expand Down
13 changes: 8 additions & 5 deletions packages/components/color-picker/components/trigger/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import TInput from '../../../input';
import { Color, getColorObject } from '../../utils';
import { TdColorPickerProps } from '../../type';
import { useBaseClassName } from '../../hooks';
import { useCommonClassName } from '@tdesign/shared-hooks';
import { useCommonClassName, useEventForward } from '@tdesign/shared-hooks';

export default defineComponent({
name: 'DefaultTrigger',
Expand Down Expand Up @@ -70,6 +70,12 @@ export default defineComponent({

const handleClear = (context: { e: MouseEvent }) => props.onTriggerClear?.(context);

const inputEvents = useEventForward(props.inputProps as TdColorPickerProps['inputProps'], {
onBlur: handleChange,
onChange: handleChange,
onClear: handleClear,
});

return () => {
const inputSlots = {
label: () => {
Expand Down Expand Up @@ -98,10 +104,7 @@ export default defineComponent({
v-slots={inputSlots}
v-model={value.value}
disabled={props.disabled}
onBlur={handleChange}
onChange={handleChange}
onClear={handleClear}
{...props.inputProps}
{...inputEvents.value}
/>
);
};
Expand Down
17 changes: 14 additions & 3 deletions packages/components/date-picker/DatePicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,15 @@ import dayjs from 'dayjs';
import { isFunction, isDate } from 'lodash-es';
import { CalendarIcon as TdCalendarIcon } from 'tdesign-icons-vue-next';

import { useConfig, useTNodeJSX, useDisabled, useReadonly, useGlobalIcon, usePrefixClass } from '@tdesign/shared-hooks';
import {
useConfig,
useTNodeJSX,
useDisabled,
useReadonly,
useGlobalIcon,
usePrefixClass,
useEventForward,
} from '@tdesign/shared-hooks';

import { useSingle } from './hooks/useSingle';
import { parseToDayjs, getDefaultFormat, formatTime, formatDate } from '@tdesign/common-js/date-picker/format';
Expand Down Expand Up @@ -343,6 +351,10 @@ export default defineComponent({
onPanelClick: () => inputRef.value?.focus?.(),
}));

const selectInputEvents = useEventForward(props.selectInputProps as TdDatePickerProps['selectInputProps'], {
onClear: onTagClearClick,
});

return () => (
<div class={COMPONENT_NAME.value}>
<TSelectInput
Expand All @@ -363,14 +375,13 @@ export default defineComponent({
popupVisible={!isReadOnly.value && popupVisible.value}
valueDisplay={() => renderTNodeJSX('valueDisplay', { params: valueDisplayParams.value })}
needConfirm={props.needConfirm}
{...(props.selectInputProps as TdDatePickerProps['selectInputProps'])}
panel={() => <TSinglePanel {...panelProps.value} />}
tagInputProps={{
onRemove: onTagRemoveClick,
}}
onClear={onTagClearClick}
prefixIcon={() => renderTNodeJSX('prefixIcon')}
suffixIcon={() => renderTNodeJSX('suffixIcon') || <CalendarIcon />}
{...selectInputEvents.value}
/>
</div>
);
Expand Down
11 changes: 7 additions & 4 deletions packages/components/input-number/input-number.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
import TButton from '../button';
import TInput from '../input';
import props from './props';
import { useGlobalIcon } from '@tdesign/shared-hooks';
import { useEventForward, useGlobalIcon } from '@tdesign/shared-hooks';
import { TdInputNumberProps } from './type';
import useInputNumber from './hooks/useInputNumber';

Expand All @@ -27,6 +27,11 @@ export default defineComponent({
const { inputRef } = p;
context.expose({ ...p });

const inputEvents = useEventForward(props.inputProps, {
onChange: p.onInnerInputChange,
...p.listeners,
});

return () => {
const reduceIcon =
props.theme === 'column' ? <ChevronDownIcon size={props.size} /> : <RemoveIcon size={props.size} />;
Expand Down Expand Up @@ -58,11 +63,9 @@ export default defineComponent({
label={props.label}
suffix={props.suffix}
tips={props.tips}
{...p.listeners}
{...props.inputProps}
v-slots={context.slots}
value={p.userInput.value}
onChange={p.onInnerInputChange}
{...inputEvents.value}
/>
{props.theme !== 'normal' && (
<TButton
Expand Down
110 changes: 61 additions & 49 deletions packages/components/range-input/range-input.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { defineComponent, ref, toRefs, computed, Fragment } from 'vue';
import { CloseCircleFilledIcon as TdCloseCircleFilledIcon } from 'tdesign-icons-vue-next';

import Input from '../input';
import Input, { TdInputProps } from '../input';
import props from './props';
import { RangeInputValue, RangeInputPosition } from './type';

Expand All @@ -14,6 +14,7 @@ import {
useGlobalIcon,
usePrefixClass,
useCommonClassName,
useEventForward,
} from '@tdesign/shared-hooks';

import { isArray } from 'lodash-es';
Expand Down Expand Up @@ -113,6 +114,63 @@ export default defineComponent({
const tips = renderTNodeJSX('tips');
const separator = renderTNodeJSX('separator');

const firstInputEvents = useEventForward(inputProps.value[0] as TdInputProps, {
onClick: ({ e }: { e: MouseEvent }) => {
props.onClick?.({ e, position: 'first' });
},
onClear: () => setInnerValue([], { position: 'first', trigger: 'input' }),
onEnter: (val, { e }) => {
handleEnter([val, innerValue.value?.[1]], { e, position: 'first' } as {
e: any;
position: RangeInputPosition;
});
},
onFocus: (val, { e }) => {
handleFocus([val, innerValue.value?.[1]], { e, position: 'first' } as {
e: any;
position: RangeInputPosition;
});
},
onBlur: (val, { e }) => {
handleBlur([val, innerValue.value?.[1]], { e, position: 'first' } as {
e: any;
position: RangeInputPosition;
});
},
onChange: (val, { e }) => {
setInnerValue([val, innerValue.value?.[1]], { e, position: 'first', trigger: 'input' });
},
});
const secondInputEvents = useEventForward(inputProps.value[1] as TdInputProps, {
onClick: ({ e }: { e: MouseEvent }) => {
props.onClick?.({ e, position: 'second' });
},
onClear: () => {
setInnerValue([], { position: 'second', trigger: 'input' });
},
onEnter: (val, { e }) => {
handleEnter([innerValue.value?.[0], val], { e, position: 'second' } as {
e: any;
position: RangeInputPosition;
});
},
onFocus: (val, { e }) => {
handleFocus([innerValue.value?.[0], val], { e, position: 'second' } as {
e: any;
position: RangeInputPosition;
});
},
onBlur: (val, { e }) => {
handleBlur([innerValue.value?.[0], val], { e, position: 'second' } as {
e: any;
position: RangeInputPosition;
});
},
onChange: (val, { e }) => {
setInnerValue([innerValue.value?.[0], val], { e, position: 'second', trigger: 'input' });
},
});

const RangeInputContent = (
<div
{...attrs}
Expand Down Expand Up @@ -147,30 +205,7 @@ export default defineComponent({
readonly={isReadonly.value}
format={format.value[0]}
value={innerValue.value?.[0]}
onClick={({ e }: { e: MouseEvent }) => props.onClick?.({ e, position: 'first' })}
onClear={() => setInnerValue([], { position: 'first', trigger: 'input' })}
onEnter={(val, { e }) =>
handleEnter([val, innerValue.value?.[1]], { e, position: 'first' } as {
e: any;
position: RangeInputPosition;
})
}
onFocus={(val, { e }) =>
handleFocus([val, innerValue.value?.[1]], { e, position: 'first' } as {
e: any;
position: RangeInputPosition;
})
}
onBlur={(val, { e }) =>
handleBlur([val, innerValue.value?.[1]], { e, position: 'first' } as {
e: any;
position: RangeInputPosition;
})
}
onChange={(val, { e }) =>
setInnerValue([val, innerValue.value?.[1]], { e, position: 'first', trigger: 'input' })
}
{...inputProps.value[0]}
{...firstInputEvents.value}
/>

<div class={`${COMPONENT_NAME.value}__inner-separator`}>{separator}</div>
Expand All @@ -186,30 +221,7 @@ export default defineComponent({
readonly={isReadonly.value}
format={format.value[1]}
value={innerValue.value?.[1]}
onClick={({ e }: { e: MouseEvent }) => props.onClick?.({ e, position: 'second' })}
onClear={() => setInnerValue([], { position: 'second', trigger: 'input' })}
onEnter={(val, { e }) =>
handleEnter([innerValue.value?.[0], val], { e, position: 'second' } as {
e: any;
position: RangeInputPosition;
})
}
onFocus={(val, { e }) =>
handleFocus([innerValue.value?.[0], val], { e, position: 'second' } as {
e: any;
position: RangeInputPosition;
})
}
onBlur={(val, { e }) =>
handleBlur([innerValue.value?.[0], val], { e, position: 'second' } as {
e: any;
position: RangeInputPosition;
})
}
onChange={(val, { e }) =>
setInnerValue([innerValue.value?.[0], val], { e, position: 'second', trigger: 'input' })
}
{...inputProps.value[1]}
{...secondInputEvents.value}
/>
{suffixContent ? <div class={`${COMPONENT_NAME.value}__suffix`}>{suffixContent}</div> : null}
{(suffixIconContent || isShowClearIcon.value) && (
Expand Down
Loading
Loading