wuji.xwt 5d259055fb refactor: code style
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
2020-09-15 19:06:35 +08:00

402 lines
10 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { func, obj, KEYCODE } from '../util';
import Input from '../input';
import Base from './base';
const { bindCtx, noop } = func;
/**
* Select.AutoComplete
*/
class AutoComplete extends Base {
static propTypes = {
...Base.propTypes,
/**
* 当前值,用于受控模式
*/
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
/**
* 初始化的默认值
*/
defaultValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
/**
* Select发生改变时触发的回调
* @param {*} value 选中的值
* @param {String} actionType 触发的方式, 'itemClick', 'enter', 'change'
* @param {*} item 选中的值的对象数据
*/
onChange: PropTypes.func,
/**
* 传入的数据源,可以动态渲染子项
*/
dataSource: PropTypes.arrayOf(
PropTypes.oneOfType([
PropTypes.shape({
value: PropTypes.string,
label: PropTypes.any,
disabled: PropTypes.bool,
children: PropTypes.array,
}),
PropTypes.string,
]),
),
/**
* 填充到选择框里的值的 key,默认是 value
*/
fillProps: PropTypes.string,
/**
* 渲染 MenuItem 内容的方法
* @param {Object} item 渲染节点的 item
* @return {ReactNode} item node
*/
itemRender: PropTypes.func,
// input keydown
onKeyDown: PropTypes.func,
// 是否将当前高亮的选项作为 placeholder
highlightHolder: PropTypes.bool,
style: PropTypes.object,
};
static defaultProps = {
...Base.defaultProps,
onKeyDown: noop,
fillProps: 'value',
};
constructor(props) {
super(props);
this.isAutoComplete = true;
this.isInputing = false;
bindCtx(this, [
'handleTriggerKeyDown',
'handleMenuSelect',
'handleItemClick',
]);
}
componentWillMount() {
this.dataStore.setOptions({ key: this.state.value });
super.componentWillMount();
}
componentWillReceiveProps(nextProps) {
if ('value' in nextProps) {
this.dataStore.setOptions({ key: nextProps.value });
this.setState({
value: nextProps.value,
});
}
if ('visible' in nextProps) {
this.setState({
visible: nextProps.visible,
});
}
this.dataStore.setOptions({
filter: nextProps.filter,
filterLocal: nextProps.filterLocal,
});
if (
nextProps.children !== this.props.children ||
nextProps.dataSource !== this.props.dataSource
) {
const dataSource = this.setDataSource(nextProps);
this.setState({
dataSource,
});
}
// remote dataSource and focused
// 因为autoComplete没有下拉数据不展示搜索并且有数据了需要自动展示下拉
if (!nextProps.filterLocal && this.isInputing) {
this.shouldControlPopup(nextProps, 'update');
}
if (!nextProps.filterLocal && !nextProps.popupContent) {
this.setFirstHightLightKeyForMenu();
}
}
componentWillUpdate() {
if (this.hasClear()) {
const inputNode = ReactDOM.findDOMNode(this.inputRef);
if (inputNode) {
this.clearNode = inputNode.querySelector(
`.${this.props.prefix}input-control`,
);
}
}
}
shouldControlPopup(props = this.props, type) {
const hasPopup =
props.popupContent || this.dataStore.getMenuDS().length;
if (hasPopup) {
this.setVisible(true, type);
} else {
this.setVisible(false, type);
}
}
handleMenuSelect(keys) {
const key = keys[0];
const mapDS = this.dataStore.getMapDS();
if (key in mapDS) {
const item = mapDS[key];
this.handleSelectEvent(key, item, 'itemClick');
}
}
handleItemClick() {
this.setVisible(false, 'itemClick');
}
handleSelectEvent(key, item, triggerType) {
const value = (item && item[this.props.fillProps]) || key;
if (triggerType === 'itemClick' || triggerType === 'enter') {
// 点击 item 的时候不会触发关闭,需要手动关闭,其它类型比如 keyDown 等都会有其它事件句柄处理
this.setVisible(false, triggerType);
}
this.handleChange(value, triggerType, item);
}
handleChange = (value, proxy, item) => {
const { disabled, readOnly, filterLocal } = this.props;
if (disabled || readOnly) {
return false;
}
const actionType = typeof proxy === 'string' ? proxy : 'change';
this.isInputing = actionType === 'change';
if (filterLocal) {
this.setState({
dataSource: this.dataStore.updateByKey(value),
});
this.shouldControlPopup(this.props, actionType);
this.setFirstHightLightKeyForMenu();
}
// 非受控模式清空内部数据
if (!('value' in this.props)) {
this.setState({
value,
});
}
this.props.onChange(value, actionType, item);
if (actionType === 'itemClick' || actionType === 'enter') {
// 点击 item 的时候不会触发关闭,需要手动关闭,其它类型比如 keyDown 等都会有其它事件句柄处理
this.setVisible(false, actionType);
}
};
handleVisibleChange(visible, type) {
if (
!('visible' in this.props) &&
visible &&
!this.props.popupContent &&
!this.dataStore.getMenuDS().length
) {
return;
}
this.setVisible(visible, type);
}
beforeClose() {
this.isInputing = false;
}
/**
* Handle trigger keydown event
* @param {Event} e
*/
handleTriggerKeyDown(e) {
const { popupContent, onToggleHighlightItem, onKeyDown } = this.props;
if (popupContent) {
e.stopPropagation(); // stopPropagation can make use onChange triggerd while typing space('') in Input
return onKeyDown(e);
}
switch (e.keyCode) {
case KEYCODE.UP:
e.preventDefault();
onToggleHighlightItem(this.toggleHighlightItem(-1, e), 'up');
break;
case KEYCODE.DOWN:
e.preventDefault();
onToggleHighlightItem(this.toggleHighlightItem(1, e), 'down');
break;
case KEYCODE.ENTER:
e.preventDefault();
this.chooseHighlightItem(e);
break;
case KEYCODE.SPACE:
// stopPropagation can make use onChange triggerd while typing space('') in Input
e.stopPropagation();
break;
case KEYCODE.ESC:
e.preventDefault();
this.state.visible && this.setVisible(false, 'esc');
break;
default:
break;
}
onKeyDown(e);
}
// 回车 选择高亮的 item
chooseHighlightItem() {
if (!this.state.visible) {
return false;
}
const { highlightKey } = this.state;
const highlightItem = this.dataStore.getEnableDS().find(item => {
return highlightKey === `${item.value}`;
});
if (highlightItem) {
this.handleSelectEvent(highlightKey, highlightItem, 'enter');
}
}
hasClear() {
const { hasClear, readOnly, disabled } = this.props;
const { value } = this.state;
return value && hasClear && !readOnly && !disabled;
}
/**
* 选择器
* @override
* @param {object} props
*/
renderSelect(props = this.props) {
const {
placeholder,
size,
prefix,
className,
style,
label,
readOnly,
disabled,
highlightHolder,
locale,
hasClear,
state,
rtl,
} = props;
const others = obj.pickOthers(AutoComplete.propTypes, props);
const othersData = obj.pickAttrsWith(others, 'data-');
const { value } = this.state;
const { visible } = this.state;
// // 下拉箭头
// const arrowNode = this.renderArrowNode(props, () => {
// this.focusInput();
// this.setVisible(!this.state.visible);
// });
// trigger className
const triggerClazz = classNames(
[
`${prefix}select`,
`${prefix}select-auto-complete`,
`${prefix}size-${size}`,
className,
],
{
[`${prefix}active`]: visible,
[`${prefix}disabled`]: disabled,
},
);
// highlightKey into placeholder
// compatible with selectPlaceHolder. TODO: removed in 2.0 version
let _placeholder =
placeholder ||
locale.autoCompletePlaceholder ||
locale.autoCompletePlaceHolder;
if (highlightHolder && visible) {
_placeholder = this.state.highlightKey || _placeholder;
}
// Input props
const _inputProps = {
...obj.pickOthers(othersData, others),
state,
ref: this.saveInputRef,
hasClear,
value,
size,
disabled,
readOnly,
placeholder: _placeholder,
label,
// extra: arrowNode,
onChange: this.handleChange,
onKeyDown: this.handleTriggerKeyDown,
};
return (
<span
{...othersData}
className={triggerClazz}
style={style}
dir={rtl ? 'rtl' : undefined}
ref={this.saveSelectRef}
onClick={this.focusInput}
>
<Input
role="combobox"
aria-autocomplete="list"
aria-disabled={disabled}
aria-expanded={this.state.visible}
{..._inputProps}
/>
<span className={`${prefix}sr-only`} aria-live="polite">
{this.state.srReader}
</span>
</span>
);
}
render() {
if (this.hasClear()) {
// clear 按钮点击后,会在 dom 结构中被删除掉,需要将其额外设置为安全节点,防止触发弹层的显示或隐藏
const safeNode = this.props.popupProps.safeNode || [];
const safeNodes = Array.isArray(safeNode) ? safeNode : [safeNode];
safeNodes.push(() => this.clearNode);
this.props.popupProps.safeNode = safeNodes;
}
return super.render(
Object.assign({}, this.props, { canCloseByTrigger: false }),
);
}
}
export default AutoComplete;