aldehyde 0.2.309 → 0.2.311

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.
Files changed (59) hide show
  1. package/lib/index.d.ts +2 -1
  2. package/lib/index.d.ts.map +1 -1
  3. package/lib/index.js +2 -1
  4. package/lib/index.js.map +1 -1
  5. package/lib/layout2/components/user-button.d.ts +4 -1
  6. package/lib/layout2/components/user-button.d.ts.map +1 -1
  7. package/lib/layout2/components/user-button.js +4 -5
  8. package/lib/layout2/components/user-button.js.map +1 -1
  9. package/lib/layout3/css/main.css +12 -1
  10. package/lib/layout3/css/sider.css +0 -3
  11. package/lib/layout3/css/tabs-layout.css +0 -11
  12. package/lib/layout3/header.js +1 -1
  13. package/lib/layout3/header.js.map +1 -1
  14. package/lib/layout3/main.d.ts.map +1 -1
  15. package/lib/layout3/main.js +0 -1
  16. package/lib/layout3/main.js.map +1 -1
  17. package/lib/layout3/page.d.ts.map +1 -1
  18. package/lib/layout3/page.js +2 -2
  19. package/lib/layout3/page.js.map +1 -1
  20. package/lib/layout3/sider.d.ts.map +1 -1
  21. package/lib/layout3/sider.js +0 -2
  22. package/lib/layout3/sider.js.map +1 -1
  23. package/lib/login2/login.d.ts +4 -0
  24. package/lib/login2/login.d.ts.map +1 -1
  25. package/lib/login2/login.js +14 -41
  26. package/lib/login2/login.js.map +1 -1
  27. package/lib/login3/img/login-bg.png +0 -0
  28. package/lib/login3/img/login-content-bg.png +0 -0
  29. package/lib/login3/img/logo.png +0 -0
  30. package/lib/login3/index.less +104 -0
  31. package/lib/login3/login-page.d.ts +9 -0
  32. package/lib/login3/login-page.d.ts.map +1 -0
  33. package/lib/login3/login-page.js +35 -0
  34. package/lib/login3/login-page.js.map +1 -0
  35. package/lib/table/relation-table.d.ts.map +1 -1
  36. package/lib/table/relation-table.js +12 -2
  37. package/lib/table/relation-table.js.map +1 -1
  38. package/lib/tmpl/control-type-supportor.d.ts.map +1 -1
  39. package/lib/tmpl/control-type-supportor.js +1 -0
  40. package/lib/tmpl/control-type-supportor.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/aldehyde/index.tsx +3 -1
  43. package/src/aldehyde/layout2/components/user-button.tsx +18 -15
  44. package/src/aldehyde/layout3/css/main.css +12 -1
  45. package/src/aldehyde/layout3/css/sider.css +0 -3
  46. package/src/aldehyde/layout3/css/tabs-layout.css +0 -11
  47. package/src/aldehyde/layout3/header.tsx +1 -1
  48. package/src/aldehyde/layout3/main.tsx +0 -1
  49. package/src/aldehyde/layout3/page.tsx +2 -1
  50. package/src/aldehyde/layout3/sider.tsx +0 -2
  51. package/src/aldehyde/login2/login.tsx +99 -100
  52. package/src/aldehyde/login3/img/login-bg.png +0 -0
  53. package/src/aldehyde/login3/img/login-content-bg.png +0 -0
  54. package/src/aldehyde/login3/img/logo.png +0 -0
  55. package/src/aldehyde/login3/index.less +104 -0
  56. package/src/aldehyde/login3/login-page.tsx +66 -0
  57. package/src/aldehyde/table/relation-table.tsx +10 -2
  58. package/src/aldehyde/tmpl/control-type-supportor.tsx +1 -0
  59. package/lib/lowcode-components/lowcode-view/component/screen-fit/index.less +0 -13
@@ -1,34 +1,44 @@
1
- import {Button, Col, Form, Input, Row} from "antd";
1
+ import { Button, Col, Form, Input, Row } from "antd";
2
2
  import React, { useEffect, useState } from "react";
3
3
  import HCserviceV3 from "../tmpl/hcservice-v3";
4
4
  import { useLocale } from "../locale/useLocale";
5
5
  import { useParams } from "react-router-dom";
6
6
  import Units from "../units";
7
- import {SafetyCertificateOutlined} from "@ant-design/icons";
7
+ import { SafetyCertificateOutlined } from "@ant-design/icons";
8
8
  import { useSessionStorageState } from 'ahooks';
9
- import {KeepAliveTab} from "../hooks/use-tabs";
9
+ import { KeepAliveTab } from "../hooks/use-tabs";
10
+
10
11
  type LoginPropType = {
11
12
  onFinish?: (token: string) => void;
12
13
  title?: any;
13
14
  programCode?: string;
14
15
  autoSaveUser?: boolean;
16
+ version?: string;
17
+ style?: { [key: string]: any };
15
18
  };
16
19
 
17
20
  type FormType = {
18
21
  username: string;
19
22
  password: string;
20
- kaptchaText:string;
23
+ kaptchaText: string;
21
24
  };
22
25
 
26
+ const defStyle = {
27
+ input: { borderRadius: "50px", background: "#EEF3FB" },
28
+ kaptcha: { borderRadius: "30px", background: "#EEF3FB" },
29
+ button: { shape: "round" }
30
+ }
31
+
23
32
  const Login = (props: LoginPropType) => {
33
+ const { version = "v2", style = defStyle } = props;
24
34
  // locale
25
35
  const { translate } = useLocale();
26
36
  const [keepAliveTabs, setKeepAliveTabs] = useSessionStorageState<KeepAliveTab[]>('keepAliveTabs', {
27
- defaultValue: [],
28
- });
37
+ defaultValue: [],
38
+ });
29
39
 
30
40
  useEffect(() => {
31
- localStorage.setItem("version", "v2");
41
+ localStorage.setItem("version", version);
32
42
  }, []);
33
43
 
34
44
  const { programCode: routeProgramCode } = useParams();
@@ -36,17 +46,17 @@ const Login = (props: LoginPropType) => {
36
46
  if (routeProgramCode === undefined) return;
37
47
  Units.setProgramCode(routeProgramCode);
38
48
  }, [routeProgramCode]);
39
- const [loading, setLoading] = useState<boolean>(false);
40
- const [needKaptcha, setNeedKaptcha] = useState<boolean>(false);
41
- const [kaptchaImg, setKaptchaImg] = useState<string>(null);
42
- const [kaptchaToken, setKaptchaToken] = useState<string>(null);
49
+ const [loading, setLoading] = useState<boolean>(false);
50
+ const [needKaptcha, setNeedKaptcha] = useState<boolean>(false);
51
+ const [kaptchaImg, setKaptchaImg] = useState<string>(null);
52
+ const [kaptchaToken, setKaptchaToken] = useState<string>(null);
43
53
 
44
- // form
54
+ // form
45
55
  const [form] = Form.useForm<FormType>();
46
56
  const submit = async () => {
47
- setKeepAliveTabs([]);
57
+ setKeepAliveTabs([]);
48
58
  try {
49
- const { username, password,kaptchaText } = await form.validateFields();
59
+ const { username, password, kaptchaText } = await form.validateFields();
50
60
 
51
61
  setLoading(true);
52
62
  const { programCode, onFinish } = props;
@@ -56,16 +66,16 @@ const Login = (props: LoginPropType) => {
56
66
  );
57
67
  const res = await HCserviceV3.login(
58
68
  { username, password },
59
- kaptchaToken,
60
- kaptchaText,
69
+ kaptchaToken,
70
+ kaptchaText,
61
71
  pubkey,
62
72
  programCode ? programCode : routeProgramCode
63
73
  );
64
74
  if (res.status === "success") {
65
75
  onFinish(res.token);
66
- }else if (res.status === "error") {
67
- setNeedKaptcha(true);
68
- await getKaptchaToken();
76
+ } else if (res.status === "error") {
77
+ setNeedKaptcha(true);
78
+ await getKaptchaToken();
69
79
  }
70
80
  setLoading(false);
71
81
  } catch (err) {
@@ -73,31 +83,31 @@ const Login = (props: LoginPropType) => {
73
83
  }
74
84
  };
75
85
 
76
- const handleKeyDown = (event) => {
77
- //按下enter键,触发login事件
78
- switch (event.keyCode) {
79
- case 13:
80
- submit();
81
- break;
82
- default:
83
- break;
84
- }
85
- };
86
+ const handleKeyDown = (event) => {
87
+ //按下enter键,触发login事件
88
+ switch (event.keyCode) {
89
+ case 13:
90
+ submit();
91
+ break;
92
+ default:
93
+ break;
94
+ }
95
+ };
86
96
 
87
- const getKaptchaToken = async () => {
97
+ const getKaptchaToken = async () => {
88
98
 
89
- let res = await HCserviceV3.getKaptchaToken(routeProgramCode);
90
- if (res) {
91
- let kaptchaImg;
92
- if (res.img && res.img.indexOf("data:") == 0) {
93
- kaptchaImg = res.img;
94
- } else {
95
- kaptchaImg = `data:image/png;base64,${res.img}`;
96
- }
97
- setKaptchaImg(kaptchaImg);
98
- setKaptchaToken(res.kaptchaToken);
99
- }
100
- };
99
+ let res = await HCserviceV3.getKaptchaToken(routeProgramCode);
100
+ if (res) {
101
+ let kaptchaImg;
102
+ if (res.img && res.img.indexOf("data:") == 0) {
103
+ kaptchaImg = res.img;
104
+ } else {
105
+ kaptchaImg = `data:image/png;base64,${res.img}`;
106
+ }
107
+ setKaptchaImg(kaptchaImg);
108
+ setKaptchaToken(res.kaptchaToken);
109
+ }
110
+ };
101
111
 
102
112
  // button
103
113
  return (
@@ -115,11 +125,10 @@ const Login = (props: LoginPropType) => {
115
125
  <Input
116
126
  placeholder={translate("请输入用户名")}
117
127
  style={{
118
- borderRadius: "50px",
119
- background: "#EEF3FB",
120
128
  height: "50px",
121
129
  fontSize: "15px",
122
130
  lineHeight: "15px",
131
+ ...style.input
123
132
  }}
124
133
  />
125
134
  </Form.Item>
@@ -132,70 +141,59 @@ const Login = (props: LoginPropType) => {
132
141
  placeholder={translate("请输入密码")}
133
142
  onKeyDown={handleKeyDown}
134
143
  style={{
135
- borderRadius: "50px",
136
- background: "#EEF3FB",
137
144
  height: "50px",
138
145
  fontSize: "15px",
139
146
  lineHeight: "15px",
147
+ ...style.input
140
148
  }}
141
149
  />
142
150
  </Form.Item>
143
151
  {needKaptcha ? (
144
- <Row gutter={8}>
145
- <Col span={16}>
146
- <Form.Item
147
- style={{
148
- borderRadius: "50px",
149
- background: "#EEF3FB",
150
- height: "50px",
151
- fontSize: "15px",
152
- lineHeight: "15px",
153
- }}
154
- name="kaptchaText"
155
- rules={[
156
- {
157
- required: true,
158
- message: translate("${请输入}${验证码}!"),
159
- },
160
- ]}
161
- >
162
- <Input
163
- style={{
164
- borderRadius: "50px",
165
- background: "#EEF3FB",
166
- height: "50px",
167
- fontSize: "15px",
168
- lineHeight: "15px",
169
- }}
170
- onKeyDown={handleKeyDown}
171
- prefix={
172
- <SafetyCertificateOutlined className="site-form-item-icon" />
173
- }
174
- placeholder={translate("${验证码}")}
175
- //onKeyDown={this.handleKeyDown}
176
- />
177
- </Form.Item>
178
- </Col>
179
- <Col span={8}>
180
- <img
181
- style={{
182
- borderRadius: "30px",
183
- background: "#EEF3FB",
184
- height: "50px",
185
- fontSize: "15px",
186
- lineHeight: "15px",
187
- cursor: "pointer"
188
- }}
189
- // height={50}
190
- width={110}
191
- title={translate("${点击刷新}")}
192
- onClick={getKaptchaToken}
193
- src={kaptchaImg}
194
- ></img>
195
- </Col>
196
- </Row>
152
+ <Row gutter={8}>
153
+ <Col span={16}>
154
+ <Form.Item
155
+ name="kaptchaText"
156
+ rules={[
157
+ {
158
+ required: true,
159
+ message: translate("${请输入}${验证码}!"),
160
+ },
161
+ ]}
162
+ >
163
+ <Input
164
+ style={{
165
+ height: "50px",
166
+ fontSize: "15px",
167
+ lineHeight: "15px",
168
+ ...style.input
169
+ }}
170
+ onKeyDown={handleKeyDown}
171
+ prefix={
172
+ <SafetyCertificateOutlined className="site-form-item-icon" />
173
+ }
174
+ placeholder={translate("${验证码}")}
175
+ //onKeyDown={this.handleKeyDown}
176
+ />
177
+ </Form.Item>
178
+ </Col>
179
+ <Col span={8}>
180
+ <img
181
+ style={{
182
+ height: "50px",
183
+ fontSize: "15px",
184
+ lineHeight: "15px",
185
+ cursor: "pointer",
186
+ width: "100%",
187
+ ...style.kaptcha
188
+ }}
189
+ title={translate("${点击刷新}")}
190
+ onClick={getKaptchaToken}
191
+ src={kaptchaImg}
192
+ />
193
+ </Col>
194
+ </Row>
197
195
  ) : (
198
- ""
196
+ ""
199
197
  )}
200
198
 
201
199
  <Form.Item wrapperCol={{ span: 24 }}>
@@ -210,6 +208,7 @@ const Login = (props: LoginPropType) => {
210
208
  fontSize: "15px",
211
209
  lineHeight: "15px",
212
210
  }}
211
+ {...style.button}
213
212
  >
214
213
  {translate("登录")}
215
214
  </Button>
Binary file
@@ -0,0 +1,104 @@
1
+ .login-page {
2
+ width: 100%;
3
+ height: 100%;
4
+ min-height: 640px;
5
+ position: relative;
6
+ background-size: 100% 100%;
7
+ background-repeat: no-repeat;
8
+ display: flex;
9
+ flex-direction: row-reverse;
10
+ justify-content: flex-start;
11
+ align-items: center;
12
+
13
+ .login-logo-img {
14
+ position: absolute;
15
+ top: 20%;
16
+ left: 5%;
17
+ z-index: 1;
18
+ width: 40%;
19
+ min-width: 600px;
20
+ max-width: 1000px;
21
+ }
22
+
23
+ .login-content {
24
+ width: 500px;
25
+ background: linear-gradient(0deg, #FFFFFF 65%, #DFEDFF);
26
+ background-size: 100% 100%;
27
+ background-repeat: no-repeat;
28
+ margin-right: 5%;
29
+ z-index: 9;
30
+
31
+ .login-logo {
32
+ width: 100%;
33
+ padding: 0 40px;
34
+
35
+ .login-logo-text,
36
+ .login-logo-text-sub {
37
+ font-size: 28px;
38
+ padding: 12px 0 20px;
39
+ font-family: YouSheBiaoTiHei;
40
+ text-align: justify;
41
+ font-style: normal;
42
+ text-transform: none;
43
+ background-image: linear-gradient(180deg, #FFFFFF 0%, #90DEFF 100%);
44
+ /* 可以调整方向和颜色 */
45
+ /* 2. 关键: 将背景裁剪到文字形状 */
46
+ -webkit-background-clip: text;
47
+ /* 对于 Webkit 内核浏览器 (如 Safari, 老版Chrome) */
48
+ background-clip: text;
49
+ /* 标准属性 */
50
+ /* 3. 关键: 将文字颜色设置为透明,以显示背景渐变 */
51
+ -webkit-text-fill-color: transparent;
52
+ /* 对于 Webkit 内核浏览器 */
53
+ color: transparent;
54
+ /* 标准属性,但注意某些环境下可能需 -webkit-text-fill-color 配合 */
55
+ }
56
+
57
+ .login-logo-text-sub {
58
+ font-size: 32px;
59
+ padding-top: 0;
60
+ }
61
+ }
62
+
63
+ .login-form {
64
+ padding: 40px;
65
+ min-height: 442px;
66
+ position: relative;
67
+
68
+ .ant-input::placeholder {
69
+ color: #9FCFF8;
70
+ }
71
+
72
+ .ant-input-password-icon {
73
+ color: #ffffff;
74
+ }
75
+
76
+ // 解决输入框自动填充时背景颜色变白的问题
77
+ input:-webkit-autofill,
78
+ input:-webkit-autofill:hover,
79
+ input:-webkit-autofill:focus,
80
+ input:-webkit-autofill:active {
81
+ transition: all 5000s ease-in-out 0s;
82
+ transition-property: background-color, color;
83
+ }
84
+
85
+ .reset-password {
86
+ width: 100%;
87
+ text-align: center;
88
+
89
+ .ant-btn-variant-link {
90
+ color: #9FCFF8;
91
+ }
92
+ }
93
+
94
+ .login-copyright {
95
+ font-weight: 600;
96
+ font-size: 14px;
97
+ color: #ffffff;
98
+ position: absolute;
99
+ bottom: 40px;
100
+ }
101
+ }
102
+
103
+ }
104
+ }
@@ -0,0 +1,66 @@
1
+ import React from "react";
2
+ import Login from "../login2/login";
3
+ import LoginBgPng from "./img/login-bg.png";
4
+ import LoginContentBgPng from "./img/login-content-bg.png";
5
+ import logoPng from "./img/logo.png";
6
+ import { useLocale } from "../locale/useLocale";
7
+ import HCDataSource from "../tmpl/hc-data-source";
8
+ import ProgramConfig from "../units";
9
+ import ResetPassword from "../layout/menu/reset-password";
10
+ import "./index.less";
11
+
12
+ type LoginPageProps = {
13
+ programName?: string;
14
+ copyright?: string;
15
+ };
16
+
17
+ const LoginPage = (props: LoginPageProps) => {
18
+
19
+ const { translate } = useLocale();
20
+
21
+ return (
22
+ <div
23
+ className="login-page"
24
+ style={{ backgroundImage: `url(${LoginBgPng})` }}
25
+ >
26
+ <img src={logoPng} alt="" className="login-logo-img" />
27
+ <div className="login-content" style={{ backgroundImage: `url(${LoginContentBgPng})` }} >
28
+ <div className="login-logo">
29
+ <div className="login-logo-text">
30
+ {translate("${欢迎,登录}")}
31
+ </div>
32
+ <div className="login-logo-text-sub">
33
+ {props.programName == "Aldehyde" ? "" :
34
+ <>
35
+ {props.programName ? translate("${" + props.programName + "}") : translate("${" + ProgramConfig.programName() + "}")}
36
+ </>
37
+ }
38
+ </div>
39
+ </div>
40
+ <div className="login-form">
41
+ <Login
42
+ onFinish={(token) => {
43
+ HCDataSource.clear();
44
+ window.location.hash = "/v3/home";
45
+ ProgramConfig.setHydrocarbonToken(token);
46
+ }}
47
+ version="v3"
48
+ style={{
49
+ input: { background: "#00132B", borderColor: "#155b82", color: "#ffffff" },
50
+ kaptcha: { background: "#00132B", borderRadius: "6px" },
51
+ button: { shape: "default" }
52
+ }}
53
+ />
54
+ <div className="reset-password">
55
+ <ResetPassword showUserName={true} />
56
+ </div>
57
+ <div className="login-copyright">
58
+ {"Copyright ◎ 2025" + (props.copyright ? props.copyright : "浙江恩赫控股集团有限公司")}
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div >
63
+ );
64
+ };
65
+
66
+ export default LoginPage;
@@ -524,7 +524,11 @@ class RelationTable extends React.PureComponent<
524
524
 
525
525
  //追加
526
526
  if (value) {
527
- selectdDatas.unshift(...value);
527
+ if(fieldGroupConfig.addRowPosition && fieldGroupConfig.addRowPosition==='end'){
528
+ selectdDatas.push(...value);
529
+ }else{
530
+ selectdDatas.unshift(...value);
531
+ }
528
532
  }
529
533
 
530
534
  onChange(fieldGroupConfig, selectdDatas);
@@ -603,7 +607,11 @@ class RelationTable extends React.PureComponent<
603
607
  }
604
608
  }
605
609
  if (isAdd) {
606
- datas.unshift(dtmplData);
610
+ if(fieldGroupConfig.addRowPosition && fieldGroupConfig.addRowPosition==='end'){
611
+ datas.push(dtmplData);
612
+ }else{
613
+ datas.unshift(dtmplData);
614
+ }
607
615
  }
608
616
  onChange(fieldGroupConfig, datas);
609
617
  };
@@ -45,6 +45,7 @@ SupportInputTypes.add('yes-no-switch');
45
45
  SupportInputTypes.add('caselect');
46
46
  SupportInputTypes.add('relation');
47
47
  SupportInputTypes.add('file');
48
+ SupportInputTypes.add('direct-file');
48
49
  SupportInputTypes.add('picture');
49
50
  SupportInputTypes.add('chemstruc');
50
51
  SupportInputTypes.add('sql-code-editor');
@@ -1,13 +0,0 @@
1
- .react-screen-box {
2
- background-size: 100% 100%;
3
- width: 100%;
4
- height: 100%;
5
-
6
- .screen-wrapper {
7
- transition-property: all;
8
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
9
- transition-duration: 300ms;
10
- position: relative;
11
- transform-origin: left top;
12
- }
13
- }