mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-12 04:27:39 +00:00
* [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.
161 lines
4.9 KiB
TypeScript
161 lines
4.9 KiB
TypeScript
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;
|