Files
supersonic/webapp/packages/supersonic-fe/src/components/MDatePicker/StaticDate.tsx
tristanliu 3f08d95aaa [improvement][semantic-fe] Updating the datePicker component to use dayjs instead. (#432)
* [improvement][semantic-fe] Add model alias setting & Add view permission restrictions to the model permission management tab.
[improvement][semantic-fe] Add permission control to the action buttons for the main domain; apply high sensitivity filtering to the authorization of metrics/dimensions.
[improvement][semantic-fe] Optimize the editing mode in the dimension/metric/datasource components to use the modelId stored in the database for data, instead of relying on the data from the state manager.

* [improvement][semantic-fe] Add time granularity setting in the data source configuration.

* [improvement][semantic-fe] Dictionary import for dimension values supported in Q&A visibility

* [improvement][semantic-fe] Modification of data source creation prompt wording"

* [improvement][semantic-fe] metric market experience optimization

* [improvement][semantic-fe] enhance the analysis of metric trends

* [improvement][semantic-fe] optimize the presentation of metric trend permissions

* [improvement][semantic-fe] add metric trend download functionality

* [improvement][semantic-fe] fix the dimension initialization issue in metric correlation

* [improvement][semantic-fe] Fix the issue of database changes not taking effect when creating based on an SQL data source.

* [improvement][semantic-fe] Optimizing pagination logic and some CSS styles

* [improvement][semantic-fe] Fixing the API for the indicator list by changing "current" to "pageNum"

* [improvement][semantic-fe] Fixing the default value setting for the indicator list

* [improvement][semantic-fe] Adding batch operations for indicators/dimensions/models

* [improvement][semantic-fe] Replacing the single status update API for indicators/dimensions with a batch update API

* [improvement][semantic-fe] Redesigning the indicator homepage to incorporate trend charts and table functionality for indicators

* [improvement][semantic-fe] Optimizing the logic for setting dimension values and editing data sources, and adding system settings functionality

* [improvement][semantic-fe] Upgrading antd version to 5.x, extracting the batch operation button component, optimizing the interaction for system settings, and expanding the configuration generation types for list-to-select component.

* [improvement][semantic-fe] Adding the ability to filter dimensions based on whether they are tags or not.

* [improvement][semantic-fe] Adding the ability to edit relationships between models in the canvas.

* [improvement][semantic-fe] Updating the datePicker component to use dayjs instead.
2023-11-27 21:31:51 +08:00

161 lines
4.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useState, useEffect } from 'react';
import { Space, DatePicker } from 'antd';
import { DateMode, DateRangeType, DateRangePicker, DateRangeTypeToPickerMap } from './type';
import { getDateStrings } from './utils';
import { DateSettingType, StaticDateSelectMode } from './type';
import dayjs from 'dayjs';
const { RangePicker } = DatePicker;
type Props = {
initialValues: any;
currentDateSettingType?: DateSettingType;
selectMode?: StaticDateSelectMode;
dateRangeTypeProps?: DateRangeType;
onDateRangeChange: (value: string[], config: any) => void;
};
const StaticDate: React.FC<Props> = ({
initialValues,
dateRangeTypeProps,
currentDateSettingType = DateSettingType.STATIC,
onDateRangeChange,
}: any) => {
const [latestDateMap, setLatestDateMap] = useState<any>({
maxPartition: dayjs().format('YYYY-MM-DD'),
});
const [staticFormData, setStaticFormData] = useState<any>(() => {
return {
dateSettingType: DateSettingType.STATIC,
dateMode: initialValues?.dateMode || DateMode.RANGE,
dateRangeType: initialValues?.dateRangeType || dateRangeTypeProps || DateRangeType.DAY,
dateRange: initialValues?.dateRange || [],
dateMultiple: initialValues?.dateMultiple || [],
};
});
const [dateRangeValue, setDateRangeValue] = useState<any>([]);
const [pickerType, setPickerType] = useState<PickerType>(() => {
if (dateRangeTypeProps) {
return DateRangeTypeToPickerMap[dateRangeTypeProps];
}
if (staticFormData.dateRangeType) {
return DateRangeTypeToPickerMap[staticFormData.dateRangeType];
}
return DateRangePicker.DATE;
});
useEffect(() => {
initDateRangeValue();
}, []);
useEffect(() => {
if (currentDateSettingType === DateSettingType.STATIC) {
handleDateRangeTypePropsChange(dateRangeTypeProps);
}
setPickerType(DateRangeTypeToPickerMap[dateRangeTypeProps]);
}, [dateRangeTypeProps, latestDateMap]);
const handleDateRangeTypePropsChange = async (dateRangeType: DateRangeType) => {
if (!dateRangeType) {
return;
}
setStaticFormData({
...staticFormData,
dateRangeType,
});
dateRangeChange(dateRangeValue, dateRangeType, staticFormData.dateMode);
};
const initDateRangeValue = () => {
const initDateRange = initialValues?.dateRange || [];
const [startDate, endDate] = initDateRange;
const { maxPartition } = latestDateMap;
let dateRangeMoment = [dayjs(), dayjs()];
// 如果initialValues时间存在则按initialValues时间初始化
if (startDate && endDate) {
dateRangeMoment = [dayjs(startDate), dayjs(endDate)];
}
// dateRangeValue未被初始化且maxPartition存在则按maxPartition初始化
if (dateRangeValue.length === 0 && !(startDate && endDate) && maxPartition) {
dateRangeMoment = [dayjs(maxPartition), dayjs(maxPartition)];
}
// 否则按当前时间初始化
setDateRangeValue(dateRangeMoment);
};
const updateStaticFormData = (formData: any) => {
const mergeConfigTypeData = {
...staticFormData,
...formData,
dateRangeStringDesc: '',
};
const { dateRange, dateMode } = mergeConfigTypeData;
if (dateMode === DateMode.RANGE) {
const [startDate, endDate] = dateRange;
if (startDate && endDate) {
mergeConfigTypeData.dateRangeStringDesc = `${startDate}${endDate}`;
mergeConfigTypeData.dateMultiple = [];
}
}
if (dateMode === DateMode.LIST) {
mergeConfigTypeData.dateRangeStringDesc = `日期多选`;
mergeConfigTypeData.dateRange = [];
}
setStaticFormData(mergeConfigTypeData);
onDateRangeChange(mergeConfigTypeData.dateRange, mergeConfigTypeData);
};
const dateRangeChange = (
dates: any,
dateRangeType: DateRangeType,
dateMode: DateMode,
isDateRangeChange?: boolean,
) => {
if (!dates) {
updateStaticFormData({ dateRange: [] });
return;
}
const dateStrings = getDateStrings({
dates,
dateRangeType,
latestDateMap,
isDateRangeChange,
});
if (dateStrings[0] && dateStrings[1]) {
setDateRangeValue([dayjs(dateStrings[0]), dayjs(dateStrings[1])]);
updateStaticFormData({
dateMode,
dateRangeType,
dateRange: dateStrings,
});
}
};
return (
<Space>
<RangePicker
style={{ paddingBottom: 5 }}
value={dateRangeValue}
onChange={(date) => {
setDateRangeValue(date);
const dateString = getDateStrings({
dates: date,
latestDateMap,
isDateRangeChange: true,
dateRangeType: dateRangeTypeProps || staticFormData.dateRangeType,
});
updateStaticFormData({
dateRange: dateString,
dateRangeType: dateRangeTypeProps || staticFormData.dateRangeType,
});
return;
}}
allowClear={true}
picker={pickerType}
/>
{/* )} */}
</Space>
);
};
export default StaticDate;