UNPKG

@fe6/water-pro

Version:

An enterprise-class UI design language and Vue-based implementation

180 lines (153 loc) 4.79 kB
/** @format */ import type { ComputedRef, Ref } from 'vue'; import type { ColEx } from '../types'; import type { AdvanceState } from '../types/hooks'; import type { FormProps, FormSchema } from '../types/form'; import { computed, unref, watch } from 'vue'; import { isBoolean, isFunction, isNumber, isPlainObject } from '@fe6/shared'; import { useBreakpoint } from './use-breakpoint'; const BASIC_COL_LEN = 24; interface UseAdvancedContext { advanceState: AdvanceState; emit: EmitType; getProps: ComputedRef<FormProps>; getSchema: ComputedRef<FormSchema[]>; formModel: Recordable; defaultValueRef: Ref<Recordable>; } export default function ({ advanceState, emit, getProps, getSchema, formModel, defaultValueRef, }: UseAdvancedContext) { const { realWidthRef, screenEnum, screenRef } = useBreakpoint(); const getEmptySpan = computed((): number => { if (!advanceState.isAdvanced) { return 0; } // For some special cases, you need to manually specify additional blank lines const emptySpan = unref(getProps).emptySpan || 0; if (isNumber(emptySpan)) { return emptySpan as number; } if (isPlainObject(emptySpan)) { const { span = 0 } = emptySpan as Partial<ColEx>; const screen = unref(screenRef) as string; const screenSpan = (emptySpan as any)[screen.toLowerCase()]; return screenSpan || span || 0; } return 0; }); watch( [ () => unref(getSchema), () => advanceState.isAdvanced, () => unref(realWidthRef), ], () => { const { showAdvancedButton } = unref(getProps); if (showAdvancedButton) { updateAdvanced(); } }, { immediate: true }, ); function getAdvanced( itemCol: Partial<ColEx>, itemColSum = 0, isLastAction = false, ) { const width = unref(realWidthRef); const mdWidth = parseInt(itemCol.md as string) || parseInt(itemCol.xs as string) || parseInt(itemCol.sm as string) || (itemCol.span as number) || BASIC_COL_LEN; const lgWidth = parseInt(itemCol.lg as string) || mdWidth; const xlWidth = parseInt(itemCol.xl as string) || lgWidth; const xxlWidth = parseInt(itemCol.xxl as string) || xlWidth; if (width <= screenEnum.LG) { itemColSum += mdWidth; } else if (width < screenEnum.XL) { itemColSum += lgWidth; } else if (width < screenEnum.XXL) { itemColSum += xlWidth; } else { itemColSum += xxlWidth; } if (isLastAction) { advanceState.hideAdvanceBtn = false; if (itemColSum <= BASIC_COL_LEN * 2) { // When less than or equal to 2 lines, the collapse and expand buttons are not displayed advanceState.hideAdvanceBtn = true; advanceState.isAdvanced = true; } else if ( itemColSum > BASIC_COL_LEN * 2 && itemColSum <= BASIC_COL_LEN * (unref(getProps).autoAdvancedLine || 3) ) { advanceState.hideAdvanceBtn = false; // More than 3 lines collapsed by default } else if (!advanceState.isLoad) { advanceState.isLoad = true; advanceState.isAdvanced = !advanceState.isAdvanced; } return { isAdvanced: advanceState.isAdvanced, itemColSum }; } if (itemColSum > BASIC_COL_LEN) { return { isAdvanced: advanceState.isAdvanced, itemColSum }; } else { // The first line is always displayed return { isAdvanced: true, itemColSum }; } } function updateAdvanced() { let itemColSum = 0; let realItemColSum = 0; const { baseColProps = {} } = unref(getProps); for (const schema of unref(getSchema)) { const { show, colProps } = schema; let isShow = true; if (isBoolean(show)) { isShow = show as boolean; } if (isFunction(show)) { isShow = (show as Function)({ schema, model: formModel, field: schema.field, values: { ...unref(defaultValueRef), ...formModel, }, }); } if (isShow && (colProps || baseColProps)) { const { itemColSum: sum, isAdvanced } = getAdvanced( { ...baseColProps, ...colProps }, itemColSum, ); itemColSum = sum || 0; if (isAdvanced) { realItemColSum = itemColSum; } schema.isAdvanced = isAdvanced; } } advanceState.actionSpan = (realItemColSum % BASIC_COL_LEN) + unref(getEmptySpan); getAdvanced( unref(getProps).actionColOptions || { span: BASIC_COL_LEN }, itemColSum, true, ); emit('advanced-change'); } function handleToggleAdvanced() { advanceState.isAdvanced = !advanceState.isAdvanced; } return { handleToggleAdvanced }; }