Skip to content

Commit

Permalink
fix: cascader loading icon (#1075)
Browse files Browse the repository at this point in the history
* fix: cascader loading icon

* feat: select-input restore readonly

* feat: cascader code optimize

* fix: lint

* fix: isFilterable.value
  • Loading branch information
PengYYYYY committed Jun 27, 2022
1 parent 6968b8a commit 2486928
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 82 deletions.
17 changes: 15 additions & 2 deletions src/cascader/cascader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ export default defineComponent({
}}
{...(props.selectInputProps as TdSelectInputProps)}
onInputChange={(value) => {
setInputVal(value);
if (!isFilterable.value) return;
setInputVal(`${value}`);
}}
onTagChange={(val: CascaderValue, ctx) => {
handleRemoveTagEffect(cascaderContext.value, ctx.index, props.onRemove);
Expand All @@ -95,7 +96,19 @@ export default defineComponent({
if (disabled.value) return;
setVisible(val, context);
}}
onClear={({ e }) => {
onBlur={(val, context) => {
props.onBlur?.({
value: cascaderContext.value.value,
e: context.e,
});
}}
onFocus={(val, context) => {
props.onFocus?.({
value: cascaderContext.value.value,
e: context.e,
});
}}
onClear={() => {
closeIconClickEffect(cascaderContext.value);
}}
v-slots={{
Expand Down
17 changes: 7 additions & 10 deletions src/cascader/components/Item.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,16 @@ const props = {
cascaderContext: {
type: Object as PropType<CascaderContextType>,
},
onChange: Function as PropType<(node: TreeNode) => void>,
onClick: Function as PropType<(node: TreeNode) => void>,
onMouseenter: Function as PropType<(node: TreeNode) => void>,
onChange: Function as PropType<() => void>,
onClick: Function as PropType<() => void>,
onMouseenter: Function as PropType<() => void>,
};

export default defineComponent({
name: 'TCascaderItem',
props,
setup(props) {
const liRef = ref<HTMLElement>();
const liRef2 = ref<HTMLElement>();
useRipple(liRef);

const COMPONENT_NAME = usePrefixClass('cascader__item');
Expand Down Expand Up @@ -72,7 +71,6 @@ export default defineComponent({
const labelCont = (
<span
title={cascaderContext.inputVal ? getFullPathLabel(node) : node.label}
ref={liRef2}
class={[`${COMPONENT_NAME.value}-label`, `${COMPONENT_NAME.value}-label--ellipsis`]}
role="label"
>
Expand All @@ -84,18 +82,17 @@ export default defineComponent({
}

function RenderCheckBox(node: TreeNode, cascaderContext: CascaderContextType) {
const { checkProps, value, max, inputVal, size } = cascaderContext;
const { checkProps, value, max, inputVal } = cascaderContext;
const label = RenderLabelInner(node, cascaderContext);
return (
<Checkbox
checked={node.checked}
indeterminate={node.indeterminate}
disabled={node.isDisabled() || ((value as TreeNodeValue[]).length >= max && max !== 0)}
name={node.value}
size={size}
title={inputVal ? getFullPathLabel(node) : node.label}
onChange={() => {
props.onChange(node);
props.onChange();
}}
{...checkProps}
>
Expand All @@ -112,11 +109,11 @@ export default defineComponent({
class={itemClass.value}
onClick={(e: Event) => {
e.stopPropagation();
props.onClick(node);
props.onClick();
}}
onMouseenter={(e: Event) => {
e.stopPropagation();
props.onMouseenter(node);
props.onMouseenter();
}}
>
{cascaderContext.multiple ? RenderCheckBox(node, cascaderContext) : RenderLabelContent(node, cascaderContext)}
Expand Down
24 changes: 5 additions & 19 deletions src/cascader/components/Panel.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { defineComponent, PropType, ref, computed, watch, nextTick } from 'vue';
import { defineComponent, PropType, computed } from 'vue';

import Item from './Item';
import { TreeNode, CascaderContextType } from '../interface';
Expand All @@ -15,10 +15,6 @@ export default defineComponent({
empty: CascaderProps.empty,
trigger: CascaderProps.trigger,
onChange: CascaderProps.onChange,
visible: {
type: Boolean,
default: true,
},
cascaderContext: {
type: Object as PropType<CascaderContextType>,
},
Expand All @@ -28,7 +24,6 @@ export default defineComponent({
const renderTNodeJSXDefault = useTNodeDefault();
const COMPONENT_NAME = usePrefixClass('cascader');
const { global, t } = useConfig('cascader');
const itemShow = ref(props.visible);

const panels = computed(() => getPanels(props.cascaderContext.treeNodes));

Expand All @@ -37,27 +32,18 @@ export default defineComponent({
expendClickEffect(propsTrigger, trigger, node, cascaderContext);
};

watch(
() => props.visible,
() => {
nextTick(() => {
itemShow.value = props.visible;
});
},
);

const renderItem = (node: TreeNode) => (
<Item
key={node.value}
node={node}
cascaderContext={props.cascaderContext}
onClick={(node: TreeNode) => {
onClick={() => {
handleExpand(node, 'click');
}}
onMouseenter={(node: TreeNode) => {
onMouseenter={() => {
handleExpand(node, 'hover');
}}
onChange={(node) => {
onChange={() => {
valueChangeEffect(node, props.cascaderContext);
}}
/>
Expand Down Expand Up @@ -94,7 +80,7 @@ export default defineComponent({
? renderPanels()
: renderTNodeJSXDefault(
'empty',
<div class={`${COMPONENT_NAME.value}__panel--empty`}>{t(global.value.empty)}</div>,
<div class={`${COMPONENT_NAME.value}__panel--empty`}>{global.value.empty}</div>,
)}
</div>
);
Expand Down
2 changes: 1 addition & 1 deletion src/cascader/core/className.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,5 +94,5 @@ export function getCascaderItemIconClass(
STATUS: Record<string, string>,
cascaderContext: CascaderContextType,
) {
return [`${prefix}-cascader__item-icon`, ...getNodeStatusClass(node, STATUS, cascaderContext)];
return [`${prefix}-cascader__item-icon`, `${prefix}-icon`, ...getNodeStatusClass(node, STATUS, cascaderContext)];
}
8 changes: 4 additions & 4 deletions src/cascader/core/effect.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import isNumber from 'lodash/isNumber';
import isFunction from 'lodash/isFunction';
import cloneDeep from 'lodash/cloneDeep';
import { TreeNode, CascaderContextType, CascaderProps, TreeNodeValue, TreeNodeModel } from '../interface';
import { TreeNode, CascaderContextType, TdCascaderProps, TreeNodeValue, TreeNodeModel } from '../interface';
import { getFullPathLabel, getTreeValue } from './helper';

/**
Expand All @@ -12,8 +12,8 @@ import { getFullPathLabel, getTreeValue } from './helper';
* @param cascaderContext
*/
export function expendClickEffect(
propsTrigger: CascaderProps['trigger'],
trigger: CascaderProps['trigger'],
propsTrigger: TdCascaderProps['trigger'],
trigger: TdCascaderProps['trigger'],
node: TreeNode,
cascaderContext: CascaderContextType,
) {
Expand Down Expand Up @@ -129,7 +129,7 @@ export function closeIconClickEffect(cascaderContext: CascaderContextType) {
export function handleRemoveTagEffect(
cascaderContext: CascaderContextType,
index: number,
onRemove: CascaderProps['onRemove'],
onRemove: TdCascaderProps['onRemove'],
) {
const { disabled, setValue, value, valueType, treeStore } = cascaderContext;

Expand Down
4 changes: 2 additions & 2 deletions src/cascader/core/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import isEmpty from 'lodash/isEmpty';
import {
TreeNode,
CascaderContextType,
CascaderProps,
TdCascaderProps,
CascaderValue,
TreeNodeValue,
TreeOptionData,
Expand Down Expand Up @@ -113,7 +113,7 @@ export const getTreeValue = (value: CascaderContextType['value']) => {
* @param multiple
* @returns
*/
export const getCascaderValue = (value: CascaderValue, valueType: CascaderProps['valueType'], multiple: boolean) => {
export const getCascaderValue = (value: CascaderValue, valueType: TdCascaderProps['valueType'], multiple: boolean) => {
if (valueType === 'single') {
return value;
}
Expand Down
14 changes: 5 additions & 9 deletions src/cascader/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import {
TreeNodeModel,
CascaderChangeSource,
CascaderValue,
CascaderContextType,
} from './interface';

// 全局状态
Expand All @@ -36,7 +35,7 @@ export const useContext = (

return {
statusContext,
cascaderContext: computed<CascaderContextType>(() => {
cascaderContext: computed(() => {
const {
size,
checkStrictly,
Expand All @@ -49,7 +48,6 @@ export const useContext = (
disabled,
showAllLevels,
minCollapsedNum,
loading,
valueType,
} = props;
return {
Expand All @@ -65,7 +63,6 @@ export const useContext = (
disabled,
showAllLevels,
minCollapsedNum,
loading,
valueType,
visible: innerPopupVisible.value,
...statusContext,
Expand Down Expand Up @@ -128,7 +125,7 @@ export const useCascaderContext = (props: TdCascaderProps) => {
if (!options.length && !treeStore) return;

if (!treeStore) {
const treeStore = new TreeStore({
const store = new TreeStore({
keys: {
...keys,
children: typeof keys.children === 'string' ? keys.children : 'children',
Expand All @@ -139,13 +136,13 @@ export const useCascaderContext = (props: TdCascaderProps) => {
checkStrictly,
onLoad: () => {
nextTick(() => {
treeStore.refreshNodes();
store.refreshNodes();
updatedTreeNodes();
});
},
});
treeStore.append(options);
statusContext.treeStore = treeStore;
store.append(options);
statusContext.treeStore = store;
} else {
treeStore.reload(options);
treeStore.refreshNodes();
Expand Down Expand Up @@ -223,7 +220,6 @@ export const useCascaderContext = (props: TdCascaderProps) => {
);

return {
setInnerValue,
cascaderContext,
isFilterable,
};
Expand Down
35 changes: 0 additions & 35 deletions src/cascader/interface.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import TreeStore from '../_common/js/tree/tree-store';
import TreeNode from '../_common/js/tree/tree-node';
import { TreeNodeModel, TreeNodeValue } from '../_common/js/tree/types';

export type CascaderProps = TdCascaderProps;

export * from './type';
export interface CascaderContextType
extends Pick<
Expand Down Expand Up @@ -36,39 +34,6 @@ export interface CascaderContextType
setExpend: (val: TreeNodeValue[]) => void;
}

export interface CascaderPanelProps extends Pick<TdCascaderProps, 'trigger' | 'empty' | 'onChange'> {
cascaderContext: CascaderContextType;
}

export interface ListenersType {
onRemove?: TdCascaderProps['onRemove'];
onBlur?: TdCascaderProps['onBlur'];
onFocus?: TdCascaderProps['onFocus'];
onChange?: TdCascaderProps['onChange'];
}
// InputContent component interfaces
export interface InputContentProps {
cascaderContext: CascaderContextType;
placeholder: TdCascaderProps['placeholder'];
listeners: ListenersType;
collapsedItems: TdCascaderProps['collapsedItems'];
}

export interface ContentProps {
cascaderContext: CascaderContextType;
placeholder: TdCascaderProps['placeholder'];
listeners: InputContentProps['listeners'];
isHover: boolean;
}
export interface CascaderItemPropsType {
node: TreeNode;
cascaderContext: CascaderContextType;
onClick: (ctx: ContextType) => void;
onChange: (ctx: ContextType | { e: boolean; node: TreeNode }) => void;
onMouseEnter: (ctx: ContextType) => void;
}

export type ContextType = { e?: Event; node?: TreeNode };
export { TreeNode } from '../_common/js/tree/tree-node';
export type { TreeNodeValue } from '../_common/js/tree/types';
export type { TreeOptionData } from '../_common/js/common';
Expand Down
2 changes: 2 additions & 0 deletions test/unit/watermark/index.test.jsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { mount } from '@vue/test-utils';
import { vi } from 'vitest';
import Watermark from '@/src/watermark/index.ts';

// every component needs four parts: props/events/slots/functions.
describe('Watermark', () => {
// test props api
describe(':props', () => {
HTMLCanvasElement.prototype.getContext = vi.fn();
it('', () => {
const wrapper = mount({
render() {
Expand Down

0 comments on commit 2486928

Please sign in to comment.