mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-03-07 02:47:12 +00:00
Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3681622 * chore: remove unnecessary code * refactor: react-render using TypeScript * chore: build-script * refactor: editor-skeleton * refactor: designer * refactor: material-parser * refactor: editor-setters * refactor: js to ts for rax-provider Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3678180 * refactor: rax-provider * feat: add build command * chore: compilerOptions for rax-provider * refactor: JS to TS for Rax Renderer Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3678935 * refactor: rax-renderer * Merge remote-tracking branch 'origin/refactor/js-to-ts' into refactor/js2ts-rax-renderer * Merge remote-tracking branch 'origin/refactor/js-to-ts' into refactor/js2ts-rax-renderer * refactor: ts-nocheck * chore: ts compile error * fix: ts rootDir * fix: compile error * chore: using same tsconfig for rax component * refactor: ts compile rax-renderer && rax-provider * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/js-to-ts # Conflicts: # packages/rax-render/src/utils/appHelper.js # packages/rax-render/src/utils/appHelper.ts # packages/utils/src/appHelper.ts * refactor: no JS file * refactor: remove lint * feat: add xima * feat: add eslint ignore * style: fix by lint * feat: lint command * fix: using the same eslint config * style: eslint settings * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/plugin-event-bind-dialog/src/index.tsx # packages/plugin-source-editor/src/index.tsx # packages/runtime/src/core/container.ts # packages/runtime/src/core/provider.ts * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/designer/src/document/document-model.ts # packages/designer/src/document/node/node-children.ts # packages/designer/src/document/node/props/prop.ts # packages/plugin-source-editor/src/index.tsx * fix: 修改dataSource items -> list * Merge remote-tracking branch 'origin/relase/1.0.0' into refactor/code-style # Conflicts: # packages/react-renderer/package.json * refactor: component-panel plugin-component-pane 代码规范化 Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3703771 * feat: support bizcomps * refactor: component-panel * style: eslint * Merge branch 'refactor/code-style' into fix/ducheng-source-style * style: code style * Merge branch 'fix/ducheng-source-style' into 'refactor/code-style' Code review title: Fix/ducheng source style Code review Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3705972 * style: for demo * style: for demo-server * style: for plugin-event-bind-dialog * style: for plugin-sample-preview * style: for plugin-undo-redo * style: plugin-variable-bind-dialog * style: types * style: for utils * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/editor-setters/src/expression-setter/locale/snippets.ts # packages/editor-setters/src/json-setter/locale/snippets.ts # packages/editor-setters/src/locale/snippets.ts # packages/plugin-components-pane/package.json # packages/rax-render/src/hoc/compWrapper.tsx # packages/rax-render/src/utils/index.ts # packages/react-renderer/src/context/appContext.ts * style: editor-preset-general editor-preset-general 代码规范化 Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3707974 * style: editor-preset-general * fix: should set field * fix: should set field - demo-server * refactor(style): fix code style for designer refactor(style): fix code style for editor-core refactor(style): fix code style for editor-skeleton refactor(style): fix code style for react-simulator-renderer refactor(style): fix code style for rax-simulator-renderer * Merge branch 'refactor/lihao-code-style' into 'refactor/code-style' Code review title: refactor(style): fix code style for designer Code review description: refactor(style): fix code style for editor-core refactor(style): fix code style for editor-skeleton refactor(style): fix code style for react-simulator-renderer refactor(style): fix code style for rax-simulator-renderer Code review Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3709472 * style: react/no-multi-comp set to 0 for designer * style: ignore editor-prset-vision * style: fix for plugin-outline-pane * style: fix for rax-provider * style: react-provider * style: runtime * style: rax-render * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/editor-setters/src/expression-setter/index.tsx # packages/plugin-source-editor/src/index.tsx # packages/plugin-source-editor/src/transform.ts * refactor: material parser code style 1. 修复eslint问题 2. instanceOf => any 3. 修复node类型解析失败问题 Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3716330 * refactor: material parser code style * refactor: code-generator code style 1. rax 出码合并 2. code style 修复 注:合并的代码中带了 datasource 的 Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3717159 * Merge branch 'feat/rax-code-generator' of gitlab.alibaba-inc.com:ali-lowcode/ali-lowcode-engine into feat/rax-code-generator # Conflicts: # packages/code-generator/src/generator/ProjectBuilder.ts # packages/code-generator/src/parser/SchemaParser.ts # packages/code-generator/src/plugins/component/rax/jsx.ts # packages/code-generator/src/plugins/project/constants.ts # packages/code-generator/src/plugins/project/framework/rax/plugins/packageJSON.ts # packages/code-generator/src/plugins/project/i18n.ts # packages/code-generator/src/publisher/disk/index.ts # packages/code-generator/src/publisher/disk/utils.ts # packages/code-generator/src/types/core.ts # packages/code-generator/src/types/schema.ts # packages/code-generator/src/utils/compositeType.ts # packages/code-generator/src/utils/nodeToJSX.ts * refactor: code-generator * Merge remote-tracking branch 'origin/refactor/code-style' into refactor/code-style-code-generator # Conflicts: # .vscode/launch.json * Revert "refactor: code-generator code style " This reverts commit ebc78e8788f83e8fda0e146758af43b878125c10. * chore: eslintrc && eslintignore * style: for plugin-source-editor * style: fix by eslint --fix * style: scripts/ * style: datasource-engine * feat: pre-commit * Merge branch 'refactor/code-style' of gitlab.alibaba-inc.com:ali-lowcode/ali-lowcode-engine into refactor/code-style # Conflicts: # .eslintignore # packages/code-generator/src/parser/SchemaParser.ts # packages/code-generator/src/plugins/component/rax/containerInitState.ts # packages/code-generator/src/plugins/component/rax/containerInjectDataSourceEngine.ts # packages/code-generator/src/plugins/component/rax/containerLifeCycle.ts # packages/code-generator/src/plugins/project/framework/rax/plugins/buildConfig.ts # packages/code-generator/src/utils/OrderedSet.ts # packages/code-generator/src/utils/ScopeBindings.ts # packages/code-generator/src/utils/expressionParser.ts # packages/code-generator/src/utils/schema.ts # packages/datasource-engine/src/core/DataSourceEngine.ts # packages/datasource-engine/src/core/RuntimeDataSource.ts # packages/datasource-engine/src/types/IRuntimeContext.ts # packages/datasource-engine/src/types/index.ts * refactor: code style code-generator 对 code style 分支上次合并的 code-generator 修改做了 revert 重新在 code style 分支基础上对代码样式做了修复 rax 合并分支会另行 fix 后向 release 分支提 MR Link: https://code.aone.alibaba-inc.com/ali-lowcode/ali-lowcode-engine/codereview/3719702 * refactor: code style fix * style: for code-generator * Merge remote-tracking branch 'origin/release/1.0.0' into refactor/code-style # Conflicts: # packages/editor-skeleton/src/transducers/addon-combine.ts # packages/plugin-components-pane/package.json # packages/plugin-components-pane/src/components/base/index.tsx # packages/plugin-components-pane/src/components/component-list/index.tsx # packages/plugin-components-pane/src/i18n/index.ts # packages/plugin-components-pane/src/i18n/strings/index.ts # packages/plugin-components-pane/src/index.tsx # packages/plugin-event-bind-dialog/src/index.tsx # packages/plugin-source-editor/src/index.tsx # packages/plugin-source-editor/src/transform.ts * style: auto fix
290 lines
8.8 KiB
TypeScript
290 lines
8.8 KiB
TypeScript
import * as React from 'react';
|
|
import classNames from 'classnames';
|
|
import padStart from 'lodash/padStart';
|
|
import { PickerPanel as RCPickerPanel } from 'rc-picker';
|
|
import { Locale } from 'rc-picker/lib/interface';
|
|
import { GenerateConfig } from 'rc-picker/lib/generate';
|
|
import {
|
|
PickerPanelBaseProps as RCPickerPanelBaseProps,
|
|
PickerPanelDateProps as RCPickerPanelDateProps,
|
|
PickerPanelTimeProps as RCPickerPanelTimeProps,
|
|
} from 'rc-picker/lib/PickerPanel';
|
|
import LocaleReceiver from '../locale-provider/LocaleReceiver';
|
|
import enUS from './locale/en_US';
|
|
import { ConfigContext } from '../config-provider';
|
|
import CalendarHeader from './Header';
|
|
|
|
type InjectDefaultProps<Props> = Omit<
|
|
Props,
|
|
'locale' | 'generateConfig' | 'prevIcon' | 'nextIcon' | 'superPrevIcon' | 'superNextIcon'
|
|
> & {
|
|
locale?: typeof enUS;
|
|
size?: 'large' | 'default' | 'small';
|
|
};
|
|
|
|
// Picker Props
|
|
export type PickerPanelBaseProps<DateType> = InjectDefaultProps<RCPickerPanelBaseProps<DateType>>;
|
|
export type PickerPanelDateProps<DateType> = InjectDefaultProps<RCPickerPanelDateProps<DateType>>;
|
|
export type PickerPanelTimeProps<DateType> = InjectDefaultProps<RCPickerPanelTimeProps<DateType>>;
|
|
|
|
export type PickerProps<DateType> =
|
|
| PickerPanelBaseProps<DateType>
|
|
| PickerPanelDateProps<DateType>
|
|
| PickerPanelTimeProps<DateType>;
|
|
|
|
export type CalendarMode = 'year' | 'month';
|
|
export type HeaderRender<DateType> = (config: {
|
|
value: DateType;
|
|
type: CalendarMode;
|
|
onChange: (date: DateType) => void;
|
|
onTypeChange: (type: CalendarMode) => void;
|
|
}) => React.ReactNode;
|
|
|
|
export interface CalendarProps<DateType> {
|
|
prefixCls?: string;
|
|
className?: string;
|
|
style?: React.CSSProperties;
|
|
locale?: typeof enUS;
|
|
validRange?: [DateType, DateType];
|
|
disabledDate?: (date: DateType) => boolean;
|
|
dateFullCellRender?: (date: DateType) => React.ReactNode;
|
|
dateCellRender?: (date: DateType) => React.ReactNode;
|
|
monthFullCellRender?: (date: DateType) => React.ReactNode;
|
|
monthCellRender?: (date: DateType) => React.ReactNode;
|
|
headerRender?: HeaderRender<DateType>;
|
|
value?: DateType;
|
|
defaultValue?: DateType;
|
|
mode?: CalendarMode;
|
|
fullscreen?: boolean;
|
|
onChange?: (date: DateType) => void;
|
|
onPanelChange?: (date: DateType, mode: CalendarMode) => void;
|
|
onSelect?: (date: DateType) => void;
|
|
}
|
|
|
|
function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) {
|
|
function isSameMonth(date1: DateType, date2: DateType) {
|
|
return (
|
|
date1 === date2 ||
|
|
(date1 &&
|
|
date2 &&
|
|
generateConfig.getYear(date1) === generateConfig.getYear(date2) &&
|
|
generateConfig.getMonth(date1) === generateConfig.getMonth(date2))
|
|
);
|
|
}
|
|
|
|
function isSameDate(date1: DateType, date2: DateType) {
|
|
return (
|
|
isSameMonth(date1, date2) && generateConfig.getDate(date1) === generateConfig.getDate(date2)
|
|
);
|
|
}
|
|
|
|
const Calendar = (props: CalendarProps<DateType>) => {
|
|
const {
|
|
prefixCls: customizePrefixCls,
|
|
className,
|
|
style,
|
|
dateFullCellRender,
|
|
dateCellRender,
|
|
monthFullCellRender,
|
|
monthCellRender,
|
|
headerRender,
|
|
value,
|
|
defaultValue,
|
|
disabledDate,
|
|
mode,
|
|
validRange,
|
|
fullscreen = true,
|
|
onChange,
|
|
onPanelChange,
|
|
onSelect,
|
|
} = props;
|
|
const { getPrefixCls } = React.useContext(ConfigContext);
|
|
const prefixCls = getPrefixCls('picker', customizePrefixCls);
|
|
const calendarPrefixCls = `${prefixCls}-calendar`;
|
|
const today = generateConfig.getNow();
|
|
|
|
// ====================== State =======================
|
|
|
|
// Value
|
|
const [innerValue, setInnerValue] = React.useState(
|
|
() => value || defaultValue || generateConfig.getNow(),
|
|
);
|
|
|
|
const mergedValue = value || innerValue;
|
|
|
|
// Mode
|
|
const [innerMode, setInnerMode] = React.useState(() => mode || 'month');
|
|
const mergedMode = mode || innerMode;
|
|
const panelMode = React.useMemo<'month' | 'date'>(
|
|
() => (mergedMode === 'year' ? 'month' : 'date'),
|
|
[mergedMode],
|
|
);
|
|
|
|
// Disabled Date
|
|
const mergedDisabledDate = React.useMemo(() => {
|
|
if (validRange) {
|
|
return (date: DateType) => {
|
|
return (
|
|
generateConfig.isAfter(validRange[0], date) ||
|
|
generateConfig.isAfter(date, validRange[1])
|
|
);
|
|
};
|
|
}
|
|
|
|
return disabledDate;
|
|
}, [disabledDate, validRange]);
|
|
|
|
// ====================== Events ======================
|
|
const triggerPanelChange = (date: DateType, newMode: CalendarMode) => {
|
|
if (onPanelChange) {
|
|
onPanelChange(date, newMode);
|
|
}
|
|
};
|
|
|
|
const triggerChange = (date: DateType) => {
|
|
setInnerValue(date);
|
|
|
|
if (!isSameDate(date, mergedValue)) {
|
|
triggerPanelChange(date, mergedMode);
|
|
|
|
if (onChange) {
|
|
onChange(date);
|
|
}
|
|
}
|
|
};
|
|
|
|
const triggerModeChange = (newMode: CalendarMode) => {
|
|
setInnerMode(newMode);
|
|
triggerPanelChange(mergedValue, newMode);
|
|
};
|
|
|
|
const onInternalSelect = (date: DateType) => {
|
|
triggerChange(date);
|
|
|
|
if (onSelect) {
|
|
onSelect(date);
|
|
}
|
|
};
|
|
|
|
// ====================== Locale ======================
|
|
const getDefaultLocale = () => {
|
|
const { locale } = props;
|
|
const result = {
|
|
...enUS,
|
|
...locale,
|
|
};
|
|
result.lang = {
|
|
...result.lang,
|
|
...((locale || {}) as any).lang,
|
|
};
|
|
return result;
|
|
};
|
|
|
|
// ====================== Render ======================
|
|
const dateRender = React.useCallback(
|
|
(date: DateType): React.ReactNode => {
|
|
if (dateFullCellRender) {
|
|
return dateFullCellRender(date);
|
|
}
|
|
|
|
return (
|
|
<div
|
|
className={classNames(`${prefixCls}-cell-inner`, `${calendarPrefixCls}-date`, {
|
|
[`${calendarPrefixCls}-date-today`]: isSameDate(today, date),
|
|
})}
|
|
>
|
|
<div className={`${calendarPrefixCls}-date-value`}>
|
|
{padStart(String(generateConfig.getDate(date)), 2, '0')}
|
|
</div>
|
|
<div className={`${calendarPrefixCls}-date-content`}>
|
|
{dateCellRender && dateCellRender(date)}
|
|
</div>
|
|
</div>
|
|
);
|
|
},
|
|
[dateFullCellRender, dateCellRender],
|
|
);
|
|
|
|
const monthRender = React.useCallback(
|
|
(date: DateType, locale: Locale): React.ReactNode => {
|
|
if (monthFullCellRender) {
|
|
return monthFullCellRender(date);
|
|
}
|
|
|
|
const months = locale.shortMonths || generateConfig.locale.getShortMonths!(locale.locale);
|
|
|
|
return (
|
|
<div
|
|
className={classNames(`${prefixCls}-cell-inner`, `${calendarPrefixCls}-date`, {
|
|
[`${calendarPrefixCls}-date-today`]: isSameMonth(today, date),
|
|
})}
|
|
>
|
|
<div className={`${calendarPrefixCls}-date-value`}>
|
|
{months[generateConfig.getMonth(date)]}
|
|
</div>
|
|
<div className={`${calendarPrefixCls}-date-content`}>
|
|
{monthCellRender && monthCellRender(date)}
|
|
</div>
|
|
</div>
|
|
);
|
|
},
|
|
[monthFullCellRender, monthCellRender],
|
|
);
|
|
|
|
return (
|
|
<LocaleReceiver componentName="Calendar" defaultLocale={getDefaultLocale}>
|
|
{(mergedLocale: any) => {
|
|
return (
|
|
<div
|
|
className={classNames(calendarPrefixCls, className, {
|
|
[`${calendarPrefixCls}-full`]: fullscreen,
|
|
[`${calendarPrefixCls}-mini`]: !fullscreen,
|
|
})}
|
|
style={style}
|
|
>
|
|
{headerRender ? (
|
|
headerRender({
|
|
value: mergedValue,
|
|
type: mergedMode,
|
|
onChange: onInternalSelect,
|
|
onTypeChange: triggerModeChange,
|
|
})
|
|
) : (
|
|
<CalendarHeader
|
|
prefixCls={calendarPrefixCls}
|
|
value={mergedValue}
|
|
generateConfig={generateConfig}
|
|
mode={mergedMode}
|
|
fullscreen={fullscreen}
|
|
locale={mergedLocale.lang}
|
|
validRange={validRange}
|
|
onChange={onInternalSelect}
|
|
onModeChange={triggerModeChange}
|
|
/>
|
|
)}
|
|
|
|
<RCPickerPanel
|
|
value={mergedValue}
|
|
prefixCls={prefixCls}
|
|
locale={mergedLocale.lang}
|
|
generateConfig={generateConfig}
|
|
dateRender={dateRender}
|
|
monthCellRender={date => monthRender(date, mergedLocale.lang)}
|
|
onSelect={onInternalSelect}
|
|
mode={panelMode}
|
|
picker={panelMode as any}
|
|
disabledDate={mergedDisabledDate}
|
|
hideHeader
|
|
/>
|
|
</div>
|
|
);
|
|
}}
|
|
</LocaleReceiver>
|
|
);
|
|
};
|
|
|
|
return Calendar;
|
|
}
|
|
|
|
export default generateCalendar;
|