import { condition, handlePlaceholder, setAdvancedConfigToProps, } from '../../util/util'; import { CnRangeDatePickerPro } from '@cainiaofe/cn-ui'; import { DisplayPosition } from '../position/display-position'; import { componentMap as formComponentMap } from '@cainiaofe/cn-ui'; import dayjs from 'dayjs'; import React, { forwardRef, useEffect, useState } from 'react'; import { createDisabledDateSetter, handleDisabledDate, requestDate, handlePreset, } from '@/common/manager/filter-item/datepicker'; import { getDateTypeSetterSnippet } from '@/common/manager/setter-snippet'; import { __advancedConfig__ } from '@/common/util/const'; import { getJSExpressionPrototype } from '@/common/manager/common-style'; import { getBizExtendPrototype, handleBizExtendComponentProps, } from '@/common/manager/plugin'; import isFunction from 'lodash/isFunction'; function RangePickerComposite(props: any): JSX.Element { const { disabledDate, getRequestParams, ...rest } = props; const extraProps = {}; const [disabledDateList, setDisabledDateList] = useState(); const [enabledDateList, setEnabledDateList] = useState(); useEffect(() => { requestDate(disabledDate, getRequestParams)?.then((res) => { if (res) { const { key, list } = res; if (key === 'disabledDate') { setDisabledDateList(list); } else if (key === 'enabledDate') { setEnabledDateList(list); } } }); }, []); extraProps.disabledDate = handleDisabledDate( disabledDate, disabledDateList, enabledDateList, getRequestParams, ); return ; } const RangePicker = { position: [ DisplayPosition.form, DisplayPosition.filter, DisplayPosition.formDialog, DisplayPosition.cnArrayTable, DisplayPosition.cnArraySubAreaCard, ], title: '日期区间选择器', componentName: 'RangePicker', component: RangePickerComposite, formItemBeforeHandler: (formItem, config) => { const { urlParams, formValue, state } = config || {}; if (formItem) { const componentProps = formItem['x-component-props']; if (componentProps) { componentProps.getRequestParams = () => { return { urlParamsDataSource: urlParams, recordDataSource: formValue, state, }; }; handlePlaceholder(componentProps); handleBizExtendComponentProps(componentProps, 'CnRangeDatePickerPro'); setAdvancedConfigToProps(componentProps); } } }, filterItemBeforeHandler: (filterItemProps, config) => { const { componentProps, urlParamsDataSource, recordDataSource, state } = config || {}; if (componentProps) { componentProps.getRequestParams = () => { return { urlParamsDataSource, recordDataSource, state, }; }; handlePlaceholder(componentProps); setAdvancedConfigToProps(componentProps); } }, formComponent: forwardRef((props, ref) => { const { disabledDate, getRequestParams, presetConfig, ...rest } = props; const extraProps = {}; const [disabledDateList, setDisabledDateList] = useState([]); const [enabledDateList, setEnabledDateList] = useState([]); useEffect(() => { requestDate(disabledDate, getRequestParams)?.then((res) => { if (res) { const { key, list } = res; if (key === 'disabledDate') { setDisabledDateList(list); } else if (key === 'enabledDate') { setEnabledDateList(list); } } }); }, []); extraProps.disabledDate = handleDisabledDate( disabledDate, disabledDateList, enabledDateList, getRequestParams, ); if (presetConfig?.length > 0 || isFunction(presetConfig)) { extraProps.preset = handlePreset(presetConfig, getRequestParams); } return ( ); }), getDefaultProps: () => { return { mode: 'date', showTime: true, }; }, getFormItemDefaultProps: () => { return { span: 2, }; }, // select的prototype列表 getPrototypeList: () => { return [ getDateTypeSetterSnippet({ name: 'mode', }), { name: 'showTime', title: '显示时间', display: 'inline', setter: 'BoolSetter', // supportVariable: true, // hidden:hidden('RangePicker'), condition(prop) { return condition(prop, 'RangePicker', 'componentName'); }, }, { name: 'outputFormat', title: '输出格式', display: 'inline', condition(prop) { return condition(prop, 'RangePicker', 'componentName'); }, setter: { componentName: 'SelectSetter', props: { options: [ { label: '时间戳', value: '', }, { label: 'YYYY-MM-DD', value: 'YYYY-MM-DD', }, { label: 'YYYY-MM-DD HH', value: 'YYYY-MM-DD HH', }, { label: 'YYYY-MM-DD HH:mm', value: 'YYYY-MM-DD HH:mm', }, { label: 'YYYY-MM-DD HH:mm:ss', value: 'YYYY-MM-DD HH:mm:ss', }, ], }, }, }, { name: 'disabledDate', title: '禁用日期', display: 'inline', condition(prop) { return condition(prop, 'RangePicker', 'componentName'); }, setter: createDisabledDateSetter(), }, { name: 'presetConfig', title: '快捷操作', display: 'inline', setter: { componentName: 'MixedSetter', props: { setters: [ { title: '选择快捷', componentName: 'CnSelectSetter', props: { mode: 'muiltiple', options: [ { label: '此刻', value: 'nowTimeRanger', }, { label: '本月', value: 'nowMonthRanger', }, ], }, }, getJSExpressionPrototype({ type: 'datepickerPreset' }), ], }, }, }, ...getBizExtendPrototype({ componentName: 'CnRangeDatePickerPro', }), { title: '高级配置', name: __advancedConfig__, display: 'accordion', extraProps: { defaultCollapsed: true, }, setter: { componentName: 'ObjectSetter', props: { config: { items: [ { name: 'resetTime', title: '时间默认为00:00:00', display: 'inline', setter: 'BoolSetter', }, ], }, }, }, }, ]; }, }; export default RangePicker;