forked from shesha-io/shesha-framework
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdateField.tsx
More file actions
111 lines (105 loc) · 4.43 KB
/
dateField.tsx
File metadata and controls
111 lines (105 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { CalendarOutlined } from '@ant-design/icons';
import React, { Fragment, useMemo } from 'react';
import ConfigurableFormItem from '@/components/formDesigner/components/formItem';
import { customDateEventHandler } from '@/components/formDesigner/components/utils';
import { DataTypes } from '@/interfaces/dataTypes';
import { IInputStyles } from '@/providers/form/models';
import { useAvailableConstantsData, validateConfigurableComponentSettings } from '@/providers/form/utils';
import { DateFieldDefinition, IDateFieldProps } from './interfaces';
import {
DATE_TIME_FORMATS,
defaultStyles,
} from './utils';
import { migratePropertyName, migrateCustomFunctions, migrateReadOnly } from '@/designer-components/_common-migrations/migrateSettings';
import { migrateVisibility } from '@/designer-components/_common-migrations/migrateVisibility';
import { DatePickerWrapper } from './datePickerWrapper';
import { migrateFormApi } from '../_common-migrations/migrateFormApi1';
import { getSettings } from './settingsForm';
import { migratePrevStyles } from '../_common-migrations/migrateStyles';
const DateField: DateFieldDefinition = {
type: 'dateField',
name: 'Date field',
isInput: true,
isOutput: true,
canBeJsSetting: true,
icon: <CalendarOutlined />,
preserveDimensionsInDesigner: true,
dataTypeSupported: ({ dataType }) => dataType === DataTypes.date || dataType === DataTypes.dateTime,
Factory: ({ model }) => {
const allData = useAvailableConstantsData();
const finalStyle = useMemo(() => !model.enableStyleOnReadonly && model.readOnly ? {
...model.allStyles.fontStyles,
...model.allStyles.dimensionsStyles,
} : model.allStyles.fullStyle, [model.enableStyleOnReadonly, model.readOnly, model.allStyles]);
return (
<Fragment>
<ConfigurableFormItem model={model}>
{(value, onChange) => {
const customEvent = customDateEventHandler(model, allData);
const onChangeInternal = (...args: any[]): void => {
customEvent.onChange(args[0], args[1]);
if (typeof onChange === 'function')
onChange(...args);
};
return <DatePickerWrapper {...model} additionalStyles={finalStyle} {...customEvent} value={value} onChange={onChangeInternal} />;
}}
</ConfigurableFormItem>
</Fragment>
);
},
settingsFormMarkup: getSettings,
validateSettings: (model) => validateConfigurableComponentSettings(getSettings, model),
initModel: (model) => {
const customModel: IDateFieldProps = {
...model,
picker: 'date',
showTime: false,
dateFormat: DATE_TIME_FORMATS?.date,
timeFormat: DATE_TIME_FORMATS.time,
defaultToMidnight: true,
};
return customModel;
},
migrator: (m) => m
.add<IDateFieldProps>(0, (prev) => migratePropertyName(migrateCustomFunctions(prev)))
.add<IDateFieldProps>(1, (prev) => migrateVisibility(prev))
.add<IDateFieldProps>(2, (prev) => migrateReadOnly(prev))
.add<IDateFieldProps>(3, (prev) => ({ ...migrateFormApi.eventsAndProperties(prev) }))
.add<IDateFieldProps>(4, (prev) => ({
...prev,
showNow: Boolean(prev.showNow || prev['showToday']),
}))
.add<IDateFieldProps>(5, (prev) => {
const styles: IInputStyles = {
size: prev.size,
hideBorder: prev.hideBorder,
style: prev.style,
};
return { ...prev, desktop: { ...styles }, tablet: { ...styles }, mobile: { ...styles } };
})
.add<IDateFieldProps>(6, (prev) => {
const styles: IInputStyles = {
size: prev.size,
width: prev.width,
height: prev.height,
hideBorder: prev.hideBorder,
borderSize: prev.borderSize,
borderRadius: prev.borderRadius,
borderColor: prev.borderColor,
fontSize: prev.fontSize,
fontColor: prev.fontColor,
backgroundColor: prev.backgroundColor,
stylingBox: prev.stylingBox,
};
return { ...prev, desktop: { ...styles }, tablet: { ...styles }, mobile: { ...styles } };
})
.add<IDateFieldProps>(7, (prev) => ({ ...migratePrevStyles(prev, defaultStyles()) })),
linkToModelMetadata: (model, metadata): IDateFieldProps => {
return {
...model,
dateFormat: !!metadata.dataFormat ? metadata.dataFormat : model.dateFormat,
showTime: metadata.dataType === DataTypes.dateTime ? true : metadata.dataType === DataTypes.date ? false : model.showTime,
};
},
};
export default DateField;