amis 1.9.0 → 1.9.1-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/RootRenderer.js +10 -2
- package/lib/RootRenderer.js.map +2 -2
- package/lib/Schema.d.ts +3 -2
- package/lib/Schema.js.map +1 -1
- package/lib/actions/Action.d.ts +1 -0
- package/lib/actions/Action.js +7 -6
- package/lib/actions/Action.js.map +2 -2
- package/lib/components/Button.d.ts +11 -10
- package/lib/components/Button.js +2 -2
- package/lib/components/Button.js.map +2 -2
- package/lib/components/CalendarMobile.d.ts +40 -40
- package/lib/components/Checkbox.js +1 -1
- package/lib/components/Checkbox.js.map +2 -2
- package/lib/components/ContextMenu.d.ts +4 -0
- package/lib/components/ContextMenu.js +23 -7
- package/lib/components/ContextMenu.js.map +2 -2
- package/lib/components/DatePicker.d.ts +40 -40
- package/lib/components/DateRangePicker.d.ts +40 -40
- package/lib/components/Form.d.ts +22 -0
- package/lib/components/Form.js +44 -0
- package/lib/components/Form.js.map +13 -0
- package/lib/components/FormField.d.ts +65 -0
- package/lib/components/FormField.js +48 -0
- package/lib/components/FormField.js.map +13 -0
- package/lib/components/InputBox.d.ts +10 -10
- package/lib/components/InputBox.js +4 -3
- package/lib/components/InputBox.js.map +2 -2
- package/lib/components/InputBoxWithSuggestion.d.ts +280 -0
- package/lib/components/InputBoxWithSuggestion.js +65 -0
- package/lib/components/InputBoxWithSuggestion.js.map +13 -0
- package/lib/components/ListGroup.d.ts +10 -10
- package/lib/components/PickerContainer.d.ts +4 -2
- package/lib/components/PickerContainer.js +28 -5
- package/lib/components/PickerContainer.js.map +2 -2
- package/lib/components/Radios.d.ts +10 -10
- package/lib/components/ResultBox.d.ts +40 -40
- package/lib/components/Select.d.ts +195 -202
- package/lib/components/Select.js +7 -3
- package/lib/components/Select.js.map +2 -2
- package/lib/components/Textarea.d.ts +568 -2
- package/lib/components/Textarea.js +129 -1
- package/lib/components/Textarea.js.map +2 -2
- package/lib/components/Toast.js +11 -9
- package/lib/components/Toast.js.map +2 -2
- package/lib/components/UserSelect.d.ts +500 -0
- package/lib/components/UserSelect.js +559 -0
- package/lib/components/UserSelect.js.map +13 -0
- package/lib/components/UserTabSelect.d.ts +320 -0
- package/lib/components/UserTabSelect.js +163 -0
- package/lib/components/UserTabSelect.js.map +13 -0
- package/lib/components/WithRemoteConfig.d.ts +7 -0
- package/lib/components/WithRemoteConfig.js +17 -11
- package/lib/components/WithRemoteConfig.js.map +2 -2
- package/lib/components/calendar/DaysView.d.ts +26 -1
- package/lib/components/calendar/DaysView.js +60 -19
- package/lib/components/calendar/DaysView.js.map +2 -2
- package/lib/components/calendar/TimeView.d.ts +1 -1
- package/lib/components/calendar/TimeView.js +10 -3
- package/lib/components/calendar/TimeView.js.map +2 -2
- package/lib/components/formula/Picker.js +4 -4
- package/lib/components/formula/Picker.js.map +2 -2
- package/lib/components/icons.d.ts +7 -1
- package/lib/components/icons.js +17 -1
- package/lib/components/icons.js.map +2 -2
- package/lib/components/index.d.ts +2 -1
- package/lib/components/index.js +3 -1
- package/lib/components/index.js.map +2 -2
- package/lib/components/json-schema/Array.d.ts +3 -0
- package/lib/components/json-schema/Array.js +125 -0
- package/lib/components/json-schema/Array.js.map +13 -0
- package/lib/components/json-schema/Item.d.ts +3 -0
- package/lib/components/json-schema/Item.js +34 -0
- package/lib/components/json-schema/Item.js.map +13 -0
- package/lib/components/json-schema/Object.d.ts +3 -0
- package/lib/components/json-schema/Object.js +178 -0
- package/lib/components/json-schema/Object.js.map +13 -0
- package/lib/components/json-schema/index.d.ts +279 -0
- package/lib/components/json-schema/index.js +16 -0
- package/lib/components/json-schema/index.js.map +13 -0
- package/lib/components/schema-editor/Array.js +2 -2
- package/lib/components/schema-editor/Array.js.map +2 -2
- package/lib/components/schema-editor/Common.d.ts +2 -0
- package/lib/components/schema-editor/Common.js +39 -3
- package/lib/components/schema-editor/Common.js.map +2 -2
- package/lib/components/schema-editor/Object.js +2 -2
- package/lib/components/schema-editor/Object.js.map +2 -2
- package/lib/components/schema-editor/index.d.ts +45 -41
- package/lib/components/schema-editor/index.js +5 -5
- package/lib/components/schema-editor/index.js.map +2 -2
- package/lib/helper.css +125 -124
- package/lib/helper.css.map +1 -1
- package/lib/hooks/use-validation-resolver.d.ts +1 -0
- package/lib/hooks/use-validation-resolver.js +49 -0
- package/lib/hooks/use-validation-resolver.js.map +13 -0
- package/lib/icons/department.js +17 -0
- package/lib/icons/menu.js +9 -0
- package/lib/icons/post.js +15 -0
- package/lib/icons/role.js +14 -0
- package/lib/icons/user-remove.js +12 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/index.js.map +2 -2
- package/lib/locale/de-DE.js +11 -1
- package/lib/locale/de-DE.js.map +2 -2
- package/lib/locale/en-US.js +12 -1
- package/lib/locale/en-US.js.map +2 -2
- package/lib/locale/zh-CN.js +14 -3
- package/lib/locale/zh-CN.js.map +2 -2
- package/lib/renderers/Action.js +25 -11
- package/lib/renderers/Action.js.map +2 -2
- package/lib/renderers/CRUD.js +5 -1
- package/lib/renderers/CRUD.js.map +2 -2
- package/lib/renderers/Dialog.js +9 -3
- package/lib/renderers/Dialog.js.map +2 -2
- package/lib/renderers/Drawer.js +5 -1
- package/lib/renderers/Drawer.js.map +2 -2
- package/lib/renderers/Form/InputDate.d.ts +2 -2
- package/lib/renderers/Form/InputDate.js.map +2 -2
- package/lib/renderers/Form/InputFile.js +5 -12
- package/lib/renderers/Form/InputFile.js.map +2 -2
- package/lib/renderers/Form/InputText.d.ts +1 -1
- package/lib/renderers/Form/InputText.js.map +1 -1
- package/lib/renderers/Form/JSONSchema.d.ts +23 -0
- package/lib/renderers/Form/JSONSchema.js +44 -0
- package/lib/renderers/Form/JSONSchema.js.map +13 -0
- package/lib/renderers/Form/JSONSchemaEditor.d.ts +2 -3
- package/lib/renderers/Form/JSONSchemaEditor.js +9 -24
- package/lib/renderers/Form/JSONSchemaEditor.js.map +2 -2
- package/lib/renderers/Form/Textarea.d.ts +1 -8
- package/lib/renderers/Form/Textarea.js +11 -75
- package/lib/renderers/Form/Textarea.js.map +2 -2
- package/lib/renderers/Form/UserSelect.d.ts +54 -0
- package/lib/renderers/Form/UserSelect.js +197 -0
- package/lib/renderers/Form/UserSelect.js.map +13 -0
- package/lib/renderers/Form/index.d.ts +1 -1
- package/lib/renderers/Form/index.js +88 -42
- package/lib/renderers/Form/index.js.map +2 -2
- package/lib/renderers/Link.d.ts +1 -1
- package/lib/renderers/Link.js +15 -29
- package/lib/renderers/Link.js.map +2 -2
- package/lib/renderers/Log.d.ts +28 -0
- package/lib/renderers/Log.js +110 -20
- package/lib/renderers/Log.js.map +2 -2
- package/lib/renderers/Page.js +5 -1
- package/lib/renderers/Page.js.map +2 -2
- package/lib/renderers/Service.js +5 -1
- package/lib/renderers/Service.js.map +2 -2
- package/lib/renderers/Wizard.js +37 -14
- package/lib/renderers/Wizard.js.map +2 -2
- package/lib/store/form.js +65 -45
- package/lib/store/form.js.map +2 -2
- package/lib/themes/ang-ie11.css +576 -24
- package/lib/themes/ang.css +553 -12
- package/lib/themes/ang.css.map +1 -1
- package/lib/themes/antd-ie11.css +576 -24
- package/lib/themes/antd.css +553 -12
- package/lib/themes/antd.css.map +1 -1
- package/lib/themes/cxd-ie11.css +576 -24
- package/lib/themes/cxd.css +553 -12
- package/lib/themes/cxd.css.map +1 -1
- package/lib/themes/dark-ie11.css +576 -24
- package/lib/themes/dark.css +553 -12
- package/lib/themes/dark.css.map +1 -1
- package/lib/themes/default-ie11.css +576 -24
- package/lib/themes/default.css +553 -12
- package/lib/themes/default.css.map +1 -1
- package/lib/utils/api.js +1 -1
- package/lib/utils/api.js.map +2 -2
- package/lib/utils/renderer-event.js.map +2 -2
- package/package.json +2 -1
- package/schema.json +542 -4
- package/scss/_properties.scss +20 -8
- package/scss/components/_input-box.scss +22 -1
- package/scss/components/_json-schema.scss +124 -0
- package/scss/components/_log.scss +37 -5
- package/scss/components/form/_date-range.scss +1 -0
- package/scss/components/form/_select.scss +9 -0
- package/scss/components/form/_transfer.scss +19 -3
- package/scss/components/form/_user-select.scss +422 -0
- package/scss/helper/background/_background-color.scss +125 -124
- package/scss/themes/_common.scss +2 -0
- package/sdk/ang-ie11.css +670 -24
- package/sdk/ang.css +647 -12
- package/sdk/antd-ie11.css +670 -24
- package/sdk/antd.css +647 -12
- package/sdk/barcode.js +51 -51
- package/sdk/charts.js +14 -14
- package/sdk/codemirror.js +7 -7
- package/sdk/color-picker.js +65 -65
- package/sdk/cropperjs.js +2 -2
- package/sdk/cxd-ie11.css +670 -24
- package/sdk/cxd.css +647 -12
- package/sdk/dark-ie11.css +670 -24
- package/sdk/dark.css +647 -12
- package/sdk/exceljs.js +1 -1
- package/sdk/helper.css +125 -124
- package/sdk/helper.css.map +1 -1
- package/sdk/locale/de-DE.js +11 -1
- package/sdk/markdown.js +69 -69
- package/sdk/papaparse.js +1 -1
- package/sdk/renderers/Form/CityDB.js +1 -1
- package/sdk/rest.js +16 -16
- package/sdk/rich-text.js +62 -62
- package/sdk/sdk-ie11.css +670 -24
- package/sdk/sdk.css +647 -12
- package/sdk/sdk.js +1651 -1637
- package/sdk/thirds/hls.js/hls.js +1 -1
- package/sdk/thirds/mpegts.js/mpegts.js +1 -1
- package/sdk/tinymce.js +57 -57
- package/src/RootRenderer.tsx +27 -15
- package/src/Schema.ts +5 -1
- package/src/actions/Action.ts +5 -4
- package/src/components/Button.tsx +3 -0
- package/src/components/Checkbox.tsx +2 -1
- package/src/components/ContextMenu.tsx +25 -7
- package/src/components/Form.tsx +70 -0
- package/src/components/FormField.tsx +127 -0
- package/src/components/InputBox.tsx +4 -1
- package/src/components/InputBoxWithSuggestion.tsx +113 -0
- package/src/components/PickerContainer.tsx +20 -5
- package/src/components/Select.tsx +18 -10
- package/src/components/Textarea.tsx +234 -2
- package/src/components/Toast.tsx +19 -18
- package/src/components/UserSelect.tsx +850 -0
- package/src/components/UserTabSelect.tsx +261 -0
- package/src/components/WithRemoteConfig.tsx +22 -7
- package/src/components/calendar/DaysView.tsx +117 -49
- package/src/components/calendar/TimeView.tsx +11 -6
- package/src/components/formula/Picker.tsx +2 -1
- package/src/components/icons.tsx +17 -1
- package/src/components/index.tsx +3 -1
- package/src/components/json-schema/Array.tsx +216 -0
- package/src/components/json-schema/Item.tsx +47 -0
- package/src/components/json-schema/Object.tsx +339 -0
- package/src/components/json-schema/index.tsx +44 -0
- package/src/components/schema-editor/Array.tsx +3 -1
- package/src/components/schema-editor/Common.tsx +61 -4
- package/src/components/schema-editor/Object.tsx +3 -1
- package/src/components/schema-editor/index.tsx +12 -5
- package/src/hooks/use-validation-resolver.ts +45 -0
- package/src/icons/department.svg +17 -0
- package/src/icons/menu.svg +2 -0
- package/src/icons/post.svg +15 -0
- package/src/icons/role.svg +14 -0
- package/src/icons/user-remove.svg +12 -0
- package/src/index.tsx +2 -0
- package/src/locale/de-DE.ts +11 -1
- package/src/locale/en-US.ts +12 -1
- package/src/locale/zh-CN.ts +14 -3
- package/src/renderers/Action.tsx +10 -9
- package/src/renderers/CRUD.tsx +5 -1
- package/src/renderers/Dialog.tsx +9 -3
- package/src/renderers/Drawer.tsx +5 -1
- package/src/renderers/Form/InputDate.tsx +9 -4
- package/src/renderers/Form/InputFile.tsx +5 -15
- package/src/renderers/Form/InputText.tsx +1 -1
- package/src/renderers/Form/JSONSchema.tsx +56 -0
- package/src/renderers/Form/JSONSchemaEditor.tsx +8 -27
- package/src/renderers/Form/Textarea.tsx +7 -117
- package/src/renderers/Form/UserSelect.tsx +263 -0
- package/src/renderers/Form/index.tsx +28 -18
- package/src/renderers/Link.tsx +5 -17
- package/src/renderers/Log.tsx +213 -19
- package/src/renderers/Page.tsx +6 -1
- package/src/renderers/Service.tsx +5 -1
- package/src/renderers/Wizard.tsx +24 -10
- package/src/store/form.ts +24 -17
- package/src/utils/api.ts +1 -1
- package/src/utils/renderer-event.ts +0 -2
|
@@ -663,7 +663,7 @@ export default class Form extends React.Component<FormProps, object> {
|
|
|
663
663
|
}
|
|
664
664
|
|
|
665
665
|
// 派发init事件,参数为初始化数据
|
|
666
|
-
const dispatcher = dispatchEvent(
|
|
666
|
+
const dispatcher = await dispatchEvent(
|
|
667
667
|
'inited',
|
|
668
668
|
createObject(this.props.data, data)
|
|
669
669
|
);
|
|
@@ -767,7 +767,7 @@ export default class Form extends React.Component<FormProps, object> {
|
|
|
767
767
|
if (result) {
|
|
768
768
|
dispatchEvent('validateSucc', data);
|
|
769
769
|
} else {
|
|
770
|
-
dispatchEvent('
|
|
770
|
+
dispatchEvent('validateError', data);
|
|
771
771
|
}
|
|
772
772
|
return result;
|
|
773
773
|
});
|
|
@@ -794,9 +794,7 @@ export default class Form extends React.Component<FormProps, object> {
|
|
|
794
794
|
submit(fn?: (values: object) => Promise<any>): Promise<any> {
|
|
795
795
|
const {store, messages, translate: __, dispatchEvent, data} = this.props;
|
|
796
796
|
this.flush();
|
|
797
|
-
const validateErrCb = () =>
|
|
798
|
-
dispatchEvent('validateFail', data);
|
|
799
|
-
};
|
|
797
|
+
const validateErrCb = () => dispatchEvent('validateError', data);
|
|
800
798
|
return store.submit(
|
|
801
799
|
fn,
|
|
802
800
|
this.hooks['validate'] || [],
|
|
@@ -871,13 +869,13 @@ export default class Form extends React.Component<FormProps, object> {
|
|
|
871
869
|
};
|
|
872
870
|
}
|
|
873
871
|
|
|
874
|
-
emitChange(submit: boolean) {
|
|
872
|
+
async emitChange(submit: boolean) {
|
|
875
873
|
const {onChange, store, submitOnChange, dispatchEvent, data} = this.props;
|
|
876
874
|
|
|
877
875
|
if (!isAlive(store)) {
|
|
878
876
|
return;
|
|
879
877
|
}
|
|
880
|
-
const dispatcher = dispatchEvent('change', createObject(data, store.data));
|
|
878
|
+
const dispatcher = await dispatchEvent('change', createObject(data, store.data));
|
|
881
879
|
if (!dispatcher?.prevented) {
|
|
882
880
|
onChange &&
|
|
883
881
|
onChange(
|
|
@@ -980,10 +978,12 @@ export default class Form extends React.Component<FormProps, object> {
|
|
|
980
978
|
data = store.data;
|
|
981
979
|
}
|
|
982
980
|
if (Array.isArray(action.required) && action.required.length) {
|
|
983
|
-
return store.validateFields(action.required).then(result => {
|
|
981
|
+
return store.validateFields(action.required).then(async result => {
|
|
984
982
|
if (!result) {
|
|
985
|
-
dispatchEvent('validateError', this.props.data);
|
|
986
|
-
|
|
983
|
+
const dispatcher = await dispatchEvent('validateError', this.props.data);
|
|
984
|
+
if (!dispatcher?.prevented) {
|
|
985
|
+
env.notify('error', __('Form.validateFailed'));
|
|
986
|
+
}
|
|
987
987
|
} else {
|
|
988
988
|
dispatchEvent('validateSucc', this.props.data);
|
|
989
989
|
this.handleAction(
|
|
@@ -1039,9 +1039,9 @@ export default class Form extends React.Component<FormProps, object> {
|
|
|
1039
1039
|
.saveRemote(action.api || (api as Api), values, {
|
|
1040
1040
|
successMessage: saveSuccess,
|
|
1041
1041
|
errorMessage: saveFailed,
|
|
1042
|
-
onSuccess: (result: Payload) => {
|
|
1042
|
+
onSuccess: async (result: Payload) => {
|
|
1043
1043
|
// result为提交接口返回的内容
|
|
1044
|
-
dispatchEvent(
|
|
1044
|
+
const dispatcher = await dispatchEvent(
|
|
1045
1045
|
'submitSucc',
|
|
1046
1046
|
createObject(this.props.data, {result})
|
|
1047
1047
|
);
|
|
@@ -1049,20 +1049,30 @@ export default class Form extends React.Component<FormProps, object> {
|
|
|
1049
1049
|
!isEffectiveApi(finnalAsyncApi, store.data) ||
|
|
1050
1050
|
store.data[finishedField || 'finished']
|
|
1051
1051
|
) {
|
|
1052
|
-
return
|
|
1052
|
+
return {
|
|
1053
|
+
cbResult: null,
|
|
1054
|
+
dispatcher
|
|
1055
|
+
};
|
|
1053
1056
|
}
|
|
1054
|
-
|
|
1057
|
+
const cbResult = until(
|
|
1055
1058
|
() => store.checkRemote(finnalAsyncApi as Api, store.data),
|
|
1056
1059
|
(ret: any) => ret && ret[finishedField || 'finished'],
|
|
1057
1060
|
cancel => (this.asyncCancel = cancel),
|
|
1058
1061
|
checkInterval
|
|
1059
|
-
)
|
|
1062
|
+
)
|
|
1063
|
+
return {
|
|
1064
|
+
cbResult,
|
|
1065
|
+
dispatcher
|
|
1066
|
+
};
|
|
1060
1067
|
},
|
|
1061
|
-
onFailed: (result: Payload) => {
|
|
1062
|
-
dispatchEvent(
|
|
1068
|
+
onFailed: async (result: Payload) => {
|
|
1069
|
+
const dispatcher = await dispatchEvent(
|
|
1063
1070
|
'submitFail',
|
|
1064
1071
|
createObject(this.props.data, {error: result})
|
|
1065
1072
|
);
|
|
1073
|
+
return {
|
|
1074
|
+
dispatcher
|
|
1075
|
+
};
|
|
1066
1076
|
}
|
|
1067
1077
|
})
|
|
1068
1078
|
.then(async response => {
|
|
@@ -1183,7 +1193,7 @@ export default class Form extends React.Component<FormProps, object> {
|
|
|
1183
1193
|
})
|
|
1184
1194
|
.catch(e => {
|
|
1185
1195
|
onFailed && onFailed(e, store.errors);
|
|
1186
|
-
if (throwErrors) {
|
|
1196
|
+
if (throwErrors || action.countDown) {
|
|
1187
1197
|
throw e;
|
|
1188
1198
|
}
|
|
1189
1199
|
});
|
package/src/renderers/Link.tsx
CHANGED
|
@@ -63,8 +63,10 @@ export class LinkCmpt extends React.Component<LinkProps, object> {
|
|
|
63
63
|
htmlTarget: ''
|
|
64
64
|
};
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
@autobind
|
|
67
|
+
handleClick(e: React.MouseEvent<any>) {
|
|
68
|
+
const {env, href, blank, body} = this.props;
|
|
69
|
+
|
|
68
70
|
env?.tracker(
|
|
69
71
|
{
|
|
70
72
|
eventType: 'url',
|
|
@@ -73,21 +75,6 @@ export class LinkCmpt extends React.Component<LinkProps, object> {
|
|
|
73
75
|
},
|
|
74
76
|
this.props
|
|
75
77
|
);
|
|
76
|
-
// 触发渲染器事件
|
|
77
|
-
const rendererEvent = await dispatchEvent(
|
|
78
|
-
'click',
|
|
79
|
-
createObject(data, {
|
|
80
|
-
// 注意:每个组件都必须把数据链带上
|
|
81
|
-
url: href,
|
|
82
|
-
blank,
|
|
83
|
-
label: body
|
|
84
|
-
})
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
// 阻止原有动作执行
|
|
88
|
-
if (rendererEvent?.prevented) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
78
|
}
|
|
92
79
|
|
|
93
80
|
getHref() {}
|
|
@@ -123,6 +110,7 @@ export class LinkCmpt extends React.Component<LinkProps, object> {
|
|
|
123
110
|
htmlTarget={htmlTarget || (blank ? '_blank' : '_self')}
|
|
124
111
|
icon={icon}
|
|
125
112
|
rightIcon={rightIcon}
|
|
113
|
+
onClick={this.handleClick}
|
|
126
114
|
>
|
|
127
115
|
{body ? render('body', body) : value || __('link')}
|
|
128
116
|
</Link>
|
package/src/renderers/Log.tsx
CHANGED
|
@@ -3,10 +3,22 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import {Renderer, RendererProps} from '../factory';
|
|
6
|
-
import {BaseSchema
|
|
6
|
+
import {BaseSchema} from '../Schema';
|
|
7
7
|
import Ansi from 'ansi-to-react';
|
|
8
|
-
import {filter} from '../utils/tpl';
|
|
9
8
|
import {buildApi, isApiOutdated} from '../utils/api';
|
|
9
|
+
import VirtualList from '../components/virtual-list';
|
|
10
|
+
import Button from '../components/Button';
|
|
11
|
+
import {
|
|
12
|
+
InputClearIcon,
|
|
13
|
+
LeftArrowIcon,
|
|
14
|
+
MinusIcon,
|
|
15
|
+
PauseIcon,
|
|
16
|
+
PlusIcon,
|
|
17
|
+
ReloadIcon,
|
|
18
|
+
RightArrowIcon
|
|
19
|
+
} from '../components/icons';
|
|
20
|
+
|
|
21
|
+
export type LogOperation = 'stop' | 'restart' | 'showLineNumber' | 'clear';
|
|
10
22
|
|
|
11
23
|
/**
|
|
12
24
|
* 日志展示组件
|
|
@@ -42,6 +54,26 @@ export interface LogSchema extends BaseSchema {
|
|
|
42
54
|
* 返回内容字符编码
|
|
43
55
|
*/
|
|
44
56
|
encoding?: string;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 限制最大日志数量
|
|
60
|
+
*/
|
|
61
|
+
maxLength?: number;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 每行高度
|
|
65
|
+
*/
|
|
66
|
+
rowHeight?: number;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 关闭 ANSI 颜色支持
|
|
70
|
+
*/
|
|
71
|
+
disableColor?: boolean;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 一些可操作选项
|
|
75
|
+
*/
|
|
76
|
+
operation?: Array<LogOperation>;
|
|
45
77
|
}
|
|
46
78
|
|
|
47
79
|
export interface LogProps
|
|
@@ -51,6 +83,9 @@ export interface LogProps
|
|
|
51
83
|
export interface LogState {
|
|
52
84
|
lastLine: string;
|
|
53
85
|
logs: string[];
|
|
86
|
+
refresh: boolean;
|
|
87
|
+
showLineNumber: boolean;
|
|
88
|
+
showOperation: boolean;
|
|
54
89
|
}
|
|
55
90
|
|
|
56
91
|
export class Log extends React.Component<LogProps, LogState> {
|
|
@@ -69,7 +104,10 @@ export class Log extends React.Component<LogProps, LogState> {
|
|
|
69
104
|
|
|
70
105
|
state: LogState = {
|
|
71
106
|
lastLine: '',
|
|
72
|
-
logs: []
|
|
107
|
+
logs: [],
|
|
108
|
+
refresh: true,
|
|
109
|
+
showLineNumber: false,
|
|
110
|
+
showOperation: false
|
|
73
111
|
};
|
|
74
112
|
|
|
75
113
|
constructor(props: LogProps) {
|
|
@@ -124,8 +162,38 @@ export class Log extends React.Component<LogProps, LogState> {
|
|
|
124
162
|
}
|
|
125
163
|
}
|
|
126
164
|
|
|
165
|
+
refresh = () => {
|
|
166
|
+
let origin = this.state.refresh;
|
|
167
|
+
this.setState({
|
|
168
|
+
refresh: !origin
|
|
169
|
+
});
|
|
170
|
+
if (!origin) {
|
|
171
|
+
this.clear();
|
|
172
|
+
this.loadLogs();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
clear = () => {
|
|
177
|
+
this.setState({
|
|
178
|
+
logs: [],
|
|
179
|
+
lastLine: ''
|
|
180
|
+
});
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
changeShowLineNumber = () => {
|
|
184
|
+
this.setState({
|
|
185
|
+
showLineNumber: !this.state.showLineNumber
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
changeShowOperation = () => {
|
|
190
|
+
this.setState({
|
|
191
|
+
showOperation: !this.state.showOperation
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
|
|
127
195
|
async loadLogs() {
|
|
128
|
-
const {source, data, env, translate: __, encoding} = this.props;
|
|
196
|
+
const {source, data, env, translate: __, encoding, maxLength} = this.props;
|
|
129
197
|
// 因为这里返回结果是流式的,和普通 api 请求不一样,如果直接用 fetcher 经过 responseAdaptor 可能会导致出错,所以就直接 fetch 了
|
|
130
198
|
const api = buildApi(source, data);
|
|
131
199
|
if (!api.url) {
|
|
@@ -146,6 +214,12 @@ export class Log extends React.Component<LogProps, LogState> {
|
|
|
146
214
|
let lastline = '';
|
|
147
215
|
let logs: string[] = [];
|
|
148
216
|
for (;;) {
|
|
217
|
+
if (!this.state.refresh) {
|
|
218
|
+
await reader.cancel('click cancel button').then(() => {
|
|
219
|
+
this.props.env.notify('success', '日志已经停止刷新');
|
|
220
|
+
return;
|
|
221
|
+
});
|
|
222
|
+
}
|
|
149
223
|
let {done, value} = await reader.read();
|
|
150
224
|
if (value) {
|
|
151
225
|
let text = new TextDecoder(encoding).decode(value, {stream: true});
|
|
@@ -162,6 +236,11 @@ export class Log extends React.Component<LogProps, LogState> {
|
|
|
162
236
|
lines[0] = lastline + lines[0];
|
|
163
237
|
// 最后一个要么是空,要么是下一行的数据
|
|
164
238
|
lastline = lines.pop() || '';
|
|
239
|
+
if (maxLength) {
|
|
240
|
+
if (logs.length + lines.length > maxLength) {
|
|
241
|
+
logs.splice(0, logs.length + lines.length - maxLength);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
165
244
|
logs = logs.concat(lines);
|
|
166
245
|
this.setState({
|
|
167
246
|
logs: logs,
|
|
@@ -180,6 +259,21 @@ export class Log extends React.Component<LogProps, LogState> {
|
|
|
180
259
|
}
|
|
181
260
|
}
|
|
182
261
|
|
|
262
|
+
/**
|
|
263
|
+
* 渲染某一行
|
|
264
|
+
*/
|
|
265
|
+
renderLine(index: number, line: string, showLineNumber: boolean) {
|
|
266
|
+
const {classnames: cx, disableColor} = this.props;
|
|
267
|
+
return (
|
|
268
|
+
<div className={cx('Log-line')} key={index}>
|
|
269
|
+
{showLineNumber && (
|
|
270
|
+
<span className={cx('Log-line-number')}>{index + 1} </span>
|
|
271
|
+
)}
|
|
272
|
+
{disableColor ? line : <Ansi useClasses>{line}</Ansi>}
|
|
273
|
+
</div>
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
183
277
|
render() {
|
|
184
278
|
const {
|
|
185
279
|
source,
|
|
@@ -187,32 +281,132 @@ export class Log extends React.Component<LogProps, LogState> {
|
|
|
187
281
|
classnames: cx,
|
|
188
282
|
placeholder,
|
|
189
283
|
height,
|
|
190
|
-
|
|
284
|
+
rowHeight,
|
|
285
|
+
disableColor,
|
|
286
|
+
translate: __,
|
|
287
|
+
operation,
|
|
288
|
+
env
|
|
191
289
|
} = this.props;
|
|
192
290
|
|
|
291
|
+
const {refresh, showLineNumber, showOperation} = this.state;
|
|
292
|
+
|
|
193
293
|
let loading = __(placeholder);
|
|
194
294
|
|
|
195
295
|
if (!source) {
|
|
196
296
|
loading = __('Log.mustHaveSource');
|
|
197
297
|
}
|
|
298
|
+
let lines: any;
|
|
198
299
|
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
300
|
+
const logs = this.state.lastLine
|
|
301
|
+
? this.state.logs.concat([this.state.lastLine])
|
|
302
|
+
: this.state.logs;
|
|
303
|
+
|
|
304
|
+
// 如果设置 rowHeight 就开启延迟渲染
|
|
305
|
+
const useVirtualRender = rowHeight;
|
|
306
|
+
|
|
307
|
+
if (useVirtualRender) {
|
|
308
|
+
lines = (
|
|
309
|
+
<VirtualList
|
|
310
|
+
height={height as number}
|
|
311
|
+
itemCount={logs.length}
|
|
312
|
+
itemSize={rowHeight}
|
|
313
|
+
renderItem={({index, style}) => (
|
|
314
|
+
<div
|
|
315
|
+
className={cx('Log-line')}
|
|
316
|
+
key={index}
|
|
317
|
+
style={{...style, whiteSpace: 'nowrap'}}
|
|
318
|
+
>
|
|
319
|
+
{showLineNumber && (
|
|
320
|
+
<span className={cx('Log-line-number')}>{index + 1} </span>
|
|
321
|
+
)}
|
|
322
|
+
{disableColor ? (
|
|
323
|
+
logs[index]
|
|
324
|
+
) : (
|
|
325
|
+
<Ansi useClasses>{logs[index]}</Ansi>
|
|
326
|
+
)}
|
|
327
|
+
</div>
|
|
328
|
+
)}
|
|
329
|
+
/>
|
|
204
330
|
);
|
|
205
|
-
}
|
|
331
|
+
} else {
|
|
332
|
+
lines = logs.map((line, index) => {
|
|
333
|
+
return this.renderLine(index, line, showLineNumber);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
206
336
|
|
|
207
337
|
return (
|
|
208
|
-
<div
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
338
|
+
<div className={cx('Log', className)}>
|
|
339
|
+
<div
|
|
340
|
+
ref={this.logRef}
|
|
341
|
+
className={cx('Log-body')}
|
|
342
|
+
style={{height: useVirtualRender ? 'auto' : height}}
|
|
343
|
+
>
|
|
344
|
+
{useVirtualRender ? lines : lines.length ? lines : loading}
|
|
345
|
+
</div>
|
|
346
|
+
<div className={cx('Log-operation')}>
|
|
347
|
+
{operation &&
|
|
348
|
+
operation?.length > 0 &&
|
|
349
|
+
(showOperation ? (
|
|
350
|
+
<>
|
|
351
|
+
{operation.includes('stop') && (
|
|
352
|
+
<Button
|
|
353
|
+
size="sm"
|
|
354
|
+
title="__('stop')"
|
|
355
|
+
disabled={!refresh}
|
|
356
|
+
onClick={this.refresh}
|
|
357
|
+
>
|
|
358
|
+
<PauseIcon />
|
|
359
|
+
</Button>
|
|
360
|
+
)}
|
|
361
|
+
|
|
362
|
+
{operation.includes('restart') && (
|
|
363
|
+
<Button
|
|
364
|
+
size="sm"
|
|
365
|
+
title={__('reload')}
|
|
366
|
+
disabled={refresh}
|
|
367
|
+
onClick={this.refresh}
|
|
368
|
+
>
|
|
369
|
+
<ReloadIcon />
|
|
370
|
+
</Button>
|
|
371
|
+
)}
|
|
372
|
+
|
|
373
|
+
{operation.includes('showLineNumber') && (
|
|
374
|
+
<Button
|
|
375
|
+
size="sm"
|
|
376
|
+
title={
|
|
377
|
+
showLineNumber
|
|
378
|
+
? __('Log.notShowLineNumber')
|
|
379
|
+
: __('Log.showLineNumber')
|
|
380
|
+
}
|
|
381
|
+
onClick={this.changeShowLineNumber}
|
|
382
|
+
>
|
|
383
|
+
{showLineNumber ? <MinusIcon /> : <PlusIcon />}
|
|
384
|
+
</Button>
|
|
385
|
+
)}
|
|
386
|
+
|
|
387
|
+
{operation.includes('clear') && (
|
|
388
|
+
<Button size="sm" title={__('clear')} onClick={this.clear}>
|
|
389
|
+
<InputClearIcon />
|
|
390
|
+
</Button>
|
|
391
|
+
)}
|
|
392
|
+
|
|
393
|
+
<Button
|
|
394
|
+
size="sm"
|
|
395
|
+
title={__('Log.collapse')}
|
|
396
|
+
onClick={this.changeShowOperation}
|
|
397
|
+
>
|
|
398
|
+
<LeftArrowIcon />
|
|
399
|
+
</Button>
|
|
400
|
+
</>
|
|
401
|
+
) : (
|
|
402
|
+
<div
|
|
403
|
+
title={__('Log.expand')}
|
|
404
|
+
className={cx('Log-operation-hidden')}
|
|
405
|
+
onClick={this.changeShowOperation}
|
|
406
|
+
>
|
|
407
|
+
<RightArrowIcon />
|
|
408
|
+
</div>
|
|
409
|
+
))}
|
|
216
410
|
</div>
|
|
217
411
|
</div>
|
|
218
412
|
);
|
package/src/renderers/Page.tsx
CHANGED
|
@@ -467,6 +467,7 @@ export default class Page extends React.Component<PageProps> {
|
|
|
467
467
|
store.openDrawer(ctx);
|
|
468
468
|
} else if (action.actionType === 'ajax') {
|
|
469
469
|
store.setCurrentAction(action);
|
|
470
|
+
|
|
470
471
|
return store
|
|
471
472
|
.saveRemote(action.api as string, ctx, {
|
|
472
473
|
successMessage:
|
|
@@ -486,7 +487,11 @@ export default class Page extends React.Component<PageProps> {
|
|
|
486
487
|
redirect && env.jumpTo(redirect, action);
|
|
487
488
|
action.reload && this.reloadTarget(action.reload, store.data);
|
|
488
489
|
})
|
|
489
|
-
.catch(() => {
|
|
490
|
+
.catch((e) => {
|
|
491
|
+
if (throwErrors || action.countDown) {
|
|
492
|
+
throw e;
|
|
493
|
+
}
|
|
494
|
+
});
|
|
490
495
|
} else {
|
|
491
496
|
return onAction(e, action, ctx, throwErrors, delegate || this.context);
|
|
492
497
|
}
|
|
@@ -523,7 +523,11 @@ export default class Service extends React.Component<ServiceProps> {
|
|
|
523
523
|
redirect && env.jumpTo(redirect, action);
|
|
524
524
|
action.reload && this.reloadTarget(action.reload, store.data);
|
|
525
525
|
})
|
|
526
|
-
.catch(() => {
|
|
526
|
+
.catch((e) => {
|
|
527
|
+
if (throwErrors || action.countDown) {
|
|
528
|
+
throw e;
|
|
529
|
+
}
|
|
530
|
+
});
|
|
527
531
|
} else {
|
|
528
532
|
onAction(e, action, data, throwErrors, delegate || this.context);
|
|
529
533
|
}
|
package/src/renderers/Wizard.tsx
CHANGED
|
@@ -718,23 +718,41 @@ export default class Wizard extends React.Component<WizardProps, WizardState> {
|
|
|
718
718
|
|
|
719
719
|
formStore
|
|
720
720
|
.saveRemote(action.api || step.api || api!, store.data, {
|
|
721
|
-
onSuccess: () => {
|
|
722
|
-
this.dispatchEvent(
|
|
721
|
+
onSuccess: async (result: any) => {
|
|
722
|
+
const dispatcher = await this.dispatchEvent(
|
|
723
|
+
'submitSucc',
|
|
724
|
+
createObject(this.props.data, {result})
|
|
725
|
+
);
|
|
723
726
|
|
|
724
727
|
if (
|
|
725
728
|
!isEffectiveApi(finnalAsyncApi, store.data) ||
|
|
726
729
|
store.data[finishedField || 'finished']
|
|
727
730
|
) {
|
|
728
|
-
return
|
|
731
|
+
return {
|
|
732
|
+
cbResult: null,
|
|
733
|
+
dispatcher
|
|
734
|
+
};
|
|
729
735
|
}
|
|
730
736
|
|
|
731
|
-
|
|
737
|
+
const cbResult = until(
|
|
732
738
|
() => store.checkRemote(finnalAsyncApi as Api, store.data),
|
|
733
739
|
(ret: any) => ret && ret[finishedField || 'finished'],
|
|
734
740
|
cancel => (this.asyncCancel = cancel)
|
|
735
741
|
);
|
|
742
|
+
return {
|
|
743
|
+
cbResult,
|
|
744
|
+
dispatcher
|
|
745
|
+
};
|
|
736
746
|
},
|
|
737
|
-
onFailed: error =>
|
|
747
|
+
onFailed: async (error: any) => {
|
|
748
|
+
const dispatcher = await this.dispatchEvent(
|
|
749
|
+
'submitFail',
|
|
750
|
+
createObject(this.props.data, {error})
|
|
751
|
+
);
|
|
752
|
+
return {
|
|
753
|
+
dispatcher
|
|
754
|
+
};
|
|
755
|
+
}
|
|
738
756
|
})
|
|
739
757
|
.then(async value => {
|
|
740
758
|
const feedback = action.feedback;
|
|
@@ -778,11 +796,7 @@ export default class Wizard extends React.Component<WizardProps, WizardState> {
|
|
|
778
796
|
|
|
779
797
|
return value;
|
|
780
798
|
})
|
|
781
|
-
.catch(error => {
|
|
782
|
-
this.dispatchEvent('submitFail', {error});
|
|
783
|
-
store.markSaving(false);
|
|
784
|
-
console.error(error);
|
|
785
|
-
});
|
|
799
|
+
.catch(error => {});
|
|
786
800
|
} else {
|
|
787
801
|
onFinished && onFinished(store.data, action);
|
|
788
802
|
this.setState({completeStep: steps.length});
|
package/src/store/form.ts
CHANGED
|
@@ -326,10 +326,7 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
|
326
326
|
}
|
|
327
327
|
|
|
328
328
|
if (!json.ok) {
|
|
329
|
-
|
|
330
|
-
if (options && options.onFailed) {
|
|
331
|
-
options.onFailed(json);
|
|
332
|
-
}
|
|
329
|
+
|
|
333
330
|
if (json.status === 422 && json.errors) {
|
|
334
331
|
setFormItemErrors(json.errors);
|
|
335
332
|
|
|
@@ -349,18 +346,19 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
|
349
346
|
throw new ServerError(self.msg, json);
|
|
350
347
|
} else {
|
|
351
348
|
updateSavedData();
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
349
|
+
let ret = options && options.onSuccess && options.onSuccess(json);
|
|
350
|
+
if (ret?.then) {
|
|
351
|
+
ret = yield ret;
|
|
352
|
+
}
|
|
353
|
+
if (ret?.cbResult?.then) {
|
|
354
|
+
yield ret.cbResult;
|
|
358
355
|
}
|
|
359
356
|
self.markSaving(false);
|
|
360
357
|
self.updateMessage(
|
|
361
358
|
json.msg ?? self.__(options && options.successMessage)
|
|
362
359
|
);
|
|
363
|
-
|
|
360
|
+
if (!ret?.dispatcher?.prevented) {
|
|
361
|
+
self.msg &&
|
|
364
362
|
getEnv(self).notify(
|
|
365
363
|
'success',
|
|
366
364
|
self.msg,
|
|
@@ -371,15 +369,21 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
|
371
369
|
}
|
|
372
370
|
: undefined
|
|
373
371
|
);
|
|
372
|
+
}
|
|
374
373
|
return json.data;
|
|
375
374
|
}
|
|
376
375
|
} catch (e) {
|
|
377
376
|
self.markSaving(false);
|
|
378
|
-
|
|
377
|
+
let ret = options && options.onFailed && options.onFailed(e.response || {});
|
|
378
|
+
if (ret?.then) {
|
|
379
|
+
ret = yield ret;
|
|
380
|
+
}
|
|
379
381
|
if (!isAlive(self) || self.disposed) {
|
|
380
382
|
return;
|
|
381
383
|
}
|
|
382
|
-
|
|
384
|
+
if (ret?.dispatcher?.prevented) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
383
387
|
if (e.type === 'ServerError') {
|
|
384
388
|
const result = (e as ServerError).response;
|
|
385
389
|
getEnv(self).notify(
|
|
@@ -395,7 +399,6 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
|
395
399
|
} else {
|
|
396
400
|
getEnv(self).notify('error', e.message);
|
|
397
401
|
}
|
|
398
|
-
|
|
399
402
|
throw e;
|
|
400
403
|
}
|
|
401
404
|
});
|
|
@@ -479,9 +482,13 @@ export const FormStore = ServiceStore.named('FormStore')
|
|
|
479
482
|
) {
|
|
480
483
|
let msg = failedMessage ?? self.__('Form.validateFailed');
|
|
481
484
|
const env = getEnv(self);
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
+
let dispatcher: any = validateErrCb && validateErrCb();
|
|
486
|
+
if (dispatcher?.then) {
|
|
487
|
+
dispatcher = yield dispatcher;
|
|
488
|
+
}
|
|
489
|
+
if (!dispatcher?.prevented){
|
|
490
|
+
msg && env.notify('error', msg);
|
|
491
|
+
}
|
|
485
492
|
throw new Error(msg);
|
|
486
493
|
}
|
|
487
494
|
|
package/src/utils/api.ts
CHANGED
|
@@ -307,7 +307,7 @@ export function responseAdaptor(ret: fetcherResult, api: ApiObject) {
|
|
|
307
307
|
if (data.hasOwnProperty('errorCode')) {
|
|
308
308
|
// 阿里 Java 规范
|
|
309
309
|
data.status = data.errorCode;
|
|
310
|
-
data.msg = data.errorMessage;
|
|
310
|
+
data.msg = data.errorMessage || data.errorMsg;
|
|
311
311
|
} else if (data.hasOwnProperty('errno')) {
|
|
312
312
|
data.status = data.errno;
|
|
313
313
|
data.msg = data.errmsg || data.errstr || data.msg;
|
|
@@ -138,7 +138,6 @@ export async function dispatchEvent(
|
|
|
138
138
|
|
|
139
139
|
unbindEvent = bindEvent(renderer);
|
|
140
140
|
}
|
|
141
|
-
|
|
142
141
|
// 没有可处理的监听
|
|
143
142
|
if (!rendererEventListeners.length) {
|
|
144
143
|
return Promise.resolve();
|
|
@@ -152,7 +151,6 @@ export async function dispatchEvent(
|
|
|
152
151
|
data,
|
|
153
152
|
scoped
|
|
154
153
|
});
|
|
155
|
-
|
|
156
154
|
// 过滤&排序
|
|
157
155
|
const listeners = rendererEventListeners
|
|
158
156
|
.filter(
|