Commit baf50caf2dab3545524df19d4eee1f8ff04e99a6

Authored by 陈洋
1 parent a0bd68bc

pref: 根据antd5 做迭代处理;以及 lodash 全局处理为按需引用

Showing 49 changed files with 248 additions and 283 deletions
... ... @@ -4,7 +4,7 @@ export default defineConfig({
4 4 apiParser: {},
5 5 outputPath: 'docs-dist',
6 6 themeConfig: {
7   - name: '@qx/common ',
  7 + name: '@qx/common',
8 8 },
9 9 resolve: {
10 10 // 配置入口文件路径,API 解析将从这里开始
... ...
... ... @@ -11,6 +11,7 @@
11 11 "dependencies": {
12 12 "@ant-design/icons": "^5.2.5",
13 13 "@qx/ui": "0.0.3-beta.1",
  14 + "classnames": "^2.3.2",
14 15 "codemirror": "5.65.8",
15 16 "dayjs": "^1.11.9",
16 17 "lodash-es": "^4.17.21",
... ...
... ... @@ -49,7 +49,8 @@
49 49 "dayjs": "^1.11.9",
50 50 "lodash-es": "^4.17.21",
51 51 "rc-virtual-list": "^3.4.13",
52   - "react-codemirror2": "^7.2.1"
  52 + "react-codemirror2": "^7.2.1",
  53 + "classnames": "^2.3.2"
53 54 },
54 55 "devDependencies": {
55 56 "@commitlint/cli": "^17.1.2",
... ...
1 1 export * from './qx-filter-condition';
2 2 export * from './qx-parameter-setting';
3 3 export * from './qx-sort-condition';
  4 +export * from './qx-base-icon';
4 5 // export * from './qx-btn';
5 6 // export { default as FieldSetter } from './qx-field-setter';
... ...
1   -import { DownOutlined, SearchOutlined } from '@ant-design/icons';
  1 +import { DownOutlined } from '@ant-design/icons';
2 2 import {
3 3 Input,
4 4 Menu,
... ... @@ -10,7 +10,7 @@ import {
10 10 // TreeSelect,
11 11 Typography,
12 12 } from 'antd';
13   -import _ from 'lodash';
  13 +import { cloneDeep } from 'lodash-es';
14 14 import React, { useEffect, useMemo, useState } from 'react';
15 15 import {
16 16 getAggreList,
... ... @@ -20,6 +20,7 @@ import {
20 20 } from './service';
21 21 // import { FRWidgetProps } from '@/packages/qx-form-generator/src';
22 22 import type { ModalProps } from 'antd';
  23 +import {QxBaseIcon} from '@qx/common';
23 24
24 25 import './styles.less';
25 26
... ... @@ -80,6 +81,9 @@ export const QxAppSelector: React.FC<QxAppSelectProps> = ({
80 81 const _item = props.item || {};
81 82 let targetItem: any = {};
82 83 getAppList(request, { from: props.from }).then((res: any) => {
  84 + if (!res?.length) {
  85 + return;
  86 + }
83 87 // eslint-disable-next-line array-callback-return
84 88 res.map((item: any) => {
85 89 if (item.code === _item['currentId']) {
... ... @@ -192,6 +196,9 @@ export const QxAppSelector: React.FC<QxAppSelectProps> = ({
192 196 } else {
193 197 if (e.target.value === 'join' && !aggreList.length) {
194 198 getAggreList(request).then((res: any) => {
  199 + if (!res?.length) {
  200 + return;
  201 + }
195 202 // eslint-disable-next-line array-callback-return
196 203 res.map((item: any) => {
197 204 item.label = item.name;
... ... @@ -240,7 +247,7 @@ export const QxAppSelector: React.FC<QxAppSelectProps> = ({
240 247
241 248 const filter = (word: string) => {
242 249 if (list) {
243   - const _data = _.cloneDeep(list);
  250 + const _data = cloneDeep(list);
244 251 _data.forEach((it: Item) => {
245 252 it.deleted = !(it.name.indexOf(word) > -1);
246 253 });
... ... @@ -264,7 +271,7 @@ export const QxAppSelector: React.FC<QxAppSelectProps> = ({
264 271 className={'qx-selector-sub-search'}
265 272 placeholder={'输入名称,回车搜索'}
266 273 allowClear
267   - prefix={<SearchOutlined />}
  274 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
268 275 onChange={(e) => {
269 276 handleChange(e.target.value);
270 277 }}
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .ant-input.select-source {
2 4 display: flex;
3 5 flex-direction: row;
... ... @@ -13,7 +15,7 @@
13 15
14 16 > .anticon {
15 17 padding: 0 6px;
16   - color: rgba(0, 0, 0, 25%);
  18 + color: @N5;
17 19 font-size: 12px;
18 20 }
19 21 }
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .qx-formula-cm {
2 4 .CodeMirror {
3 5 height: auto;
... ... @@ -6,8 +8,8 @@
6 8 }
7 9
8 10 .cm-bg .CodeMirror {
9   - background-color: #f9f9f9 !important;
10   - border: 1px solid #e7e6e6;
  11 + background-color: @N2 !important;
  12 + border: 1px solid @N4;
11 13 }
12 14
13 15 .qx-copy-send-cm {
... ... @@ -22,6 +24,6 @@
22 24 position: absolute;
23 25 right: 8px;
24 26 bottom: 8px;
25   - color: #bcb9b9;
  27 + color: @N4;
26 28 font-size: 14px;
27 29 }
... ...
1 1 import React, { useEffect, useState } from 'react';
2 2 import { UnControlled as CodeMirror } from 'react-codemirror2';
3   -import _ from 'lodash';
  3 +import { cloneDeep, flatten, sortBy, size, isEqual, forEach, debounce } from 'lodash-es';
4 4 import type { VariableMappingProps } from '../qx-field-setter';
5 5 import funObjects from './functions';
6 6 import 'codemirror/lib/codemirror.css';
... ... @@ -36,7 +36,7 @@ export type VariableProps = {
36 36 * @param code
37 37 */
38 38 export const getAllVariable = (code: string) => {
39   - let codeLocal: string = _.clone(code);
  39 + let codeLocal: string = cloneDeep(code);
40 40 if (!codeLocal) {
41 41 return [];
42 42 }
... ... @@ -126,11 +126,11 @@ const CodeEditor: React.FC<CodeHighLightProps> = ({
126 126 const [isInitDone, setIsInitDone] = useState<boolean>(false);
127 127 const [focusFun, setFocusFun] = useState<string>();
128 128
129   - const funObjs = _.flatten(funObjects.map((item: any) => item.children));
  129 + const funObjs = flatten(funObjects.map((item: any) => item.children));
130 130 const funObjSimple = {};
131 131 funObjs.map((item) => Object.assign(funObjSimple, { [item.title]: item.title }));
132 132 // 以变量字符长度排序,确保`DATAIF`比`IF`优先匹配
133   - const funObjsSort = _.sortBy(funObjs, function (o) {
  133 + const funObjsSort = sortBy(funObjs, function (o) {
134 134 return 0 - o.title.length;
135 135 });
136 136
... ... @@ -141,7 +141,7 @@ const CodeEditor: React.FC<CodeHighLightProps> = ({
141 141 setValueLocal(value);
142 142 }
143 143
144   - if (_.size(variableObj) > 0) {
  144 + if (size(variableObj) > 0) {
145 145 setVariableObjLocal(variableObj);
146 146 }
147 147 }
... ... @@ -180,7 +180,7 @@ const CodeEditor: React.FC<CodeHighLightProps> = ({
180 180 return;
181 181 }
182 182
183   - const code = _.cloneDeep(editor.getValue());
  183 + const code = cloneDeep(editor.getValue());
184 184 // 换行分隔
185 185 const codeArr = code.split('\n');
186 186 const variReplace = (cm: any, line: number) => {
... ... @@ -276,7 +276,7 @@ const CodeEditor: React.FC<CodeHighLightProps> = ({
276 276 cmUtils.variableRender(editor);
277 277
278 278 // TODO 默认值bug修复 暂时注释
279   - // const isSame = _.isEqual(valueLocal, val);
  279 + // const isSame = isEqual(valueLocal, val);
280 280 // if (isSame) {
281 281 // return;
282 282 // }
... ... @@ -310,7 +310,7 @@ const CodeEditor: React.FC<CodeHighLightProps> = ({
310 310 let flag: boolean = false;
311 311 let funName: string = '';
312 312
313   - _.forEach(funObjsSort, (v) => {
  313 + forEach(funObjsSort, (v) => {
314 314 if (flag) {
315 315 return;
316 316 }
... ... @@ -351,7 +351,7 @@ const CodeEditor: React.FC<CodeHighLightProps> = ({
351 351 // 滚动(false,默认)或自动换行
352 352 lineWrapping: true,
353 353 }}
354   - onChange={_.debounce(onValueChange, 300)}
  354 + onChange={debounce(onValueChange, 300)}
355 355 onCursor={(editor) => {
356 356 const funName = findFocusFun(editor);
357 357 setFocusFun(funName);
... ...
... ... @@ -31,7 +31,7 @@
31 31 cursor: pointer;
32 32
33 33 &:hover {
34   - background-color: @item-hover-bg;
  34 + background-color: @N3;
35 35 }
36 36 }
37 37 }
... ... @@ -44,7 +44,7 @@
44 44 &.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {
45 45 margin-top: 0;
46 46 margin-bottom: 1px;
47   - background-color: #fafafa;
  47 + background-color: @N2;
48 48 }
49 49
50 50 .ant-menu-sub.ant-menu-inline {
... ... @@ -59,7 +59,7 @@
59 59
60 60 &:hover {
61 61 color: inherit;
62   - background-color: @item-hover-bg;
  62 + background-color: @N3;
63 63 }
64 64 }
65 65
... ... @@ -74,5 +74,5 @@
74 74 padding-top: 5px;
75 75 padding-bottom: 5px;
76 76 padding-left: 24px;
77   - border-top: 1px solid #f0f0f0;
  77 + border-top: 1px solid @N4;
78 78 }
... ...
... ... @@ -5,7 +5,7 @@ import type { ReactElement } from 'react';
5 5 import { useEffect, useState } from 'react';
6 6 import QxFieldItem from '../qx-field/src/item';
7 7 import { useDebounceFn } from 'ahooks';
8   -import _ from 'lodash';
  8 +import { isEmpty } from 'lodash-es';
9 9 import { QxBaseIcon } from '../qx-base-icon';
10 10 import './index.less';
11 11
... ... @@ -100,7 +100,7 @@ export const QxFieldPopover: React.FC<QxFieldPopoverProp> = (props) => {
100 100 });
101 101 };
102 102 useEffect(() => {
103   - if (!_.isEmpty(props.data)) {
  103 + if (!isEmpty(props.data)) {
104 104 const _fields = excludeFields(props.data);
105 105 setFields(_fields);
106 106 setFilterFields(_fields);
... ... @@ -316,10 +316,9 @@ export const QxFieldPopover: React.FC<QxFieldPopoverProp> = (props) => {
316 316 // getPopupContainer={(triggerNode) => triggerNode}
317 317 content={fieldsPopContent()}
318 318 placement={'bottomRight'}
319   - // TODO 默认hover改成click 因为个别电脑输入法 输入会触发气泡的失焦事件 弹框消失
320   - trigger={props.disabled ? '' : props.trigger || 'click'}
321   - visible={visible}
322   - onVisibleChange={(v) => {
  319 + trigger={props.disabled ? undefined : props.trigger || 'click'}
  320 + open={visible}
  321 + onOpenChange={(v) => {
323 322 if (!v) {
324 323 setTimeout(() => {
325 324 setKeyword('');
... ...
... ... @@ -194,10 +194,10 @@ export const OrgSetter: React.FC<OrgSetterProps> = ({
194 194 overlayClassName={'qx-pop-select'}
195 195 getPopupContainer={(triggerNode) => triggerNode}
196 196 arrowContent={false}
197   - visible={popVisible}
198   - onVisibleChange={handlePopVisibleChange}
  197 + open={popVisible}
  198 + onOpenChange={handlePopVisibleChange}
199 199 placement="bottom"
200   - trigger={disabled ? '' : 'click'}
  200 + trigger={disabled ? undefined : 'click'}
201 201 >
202 202 <div
203 203 style={style || {}}
... ...
1 1 import React, { useEffect, useState, useMemo, useRef } from 'react';
2 2 import { Input, Cascader } from 'antd';
3 3 import { getDictDetail } from '../service';
4   -import _ from 'lodash';
  4 +import { cloneDeep, isEqual, isEmpty } from 'lodash-es';
5 5
6 6 export interface FRWidgetProps {
7 7 title?: string;
... ... @@ -96,7 +96,7 @@ const QxAddress: React.FC<FRWidgetProps> = (props) => {
96 96 // eslint-disable-next-line @typescript-eslint/no-shadow
97 97 const options: any = [];
98 98 Object.keys(opArr).forEach((key) => {
99   - let num = _.cloneDeep(level);
  99 + let num = cloneDeep(level);
100 100 const option: any = {
101 101 value: opArr[key].value,
102 102 label: opArr[key].label,
... ... @@ -142,10 +142,10 @@ const QxAddress: React.FC<FRWidgetProps> = (props) => {
142 142 _localCasValue = [];
143 143 _localTextValue = '';
144 144 }
145   - if (!_.isEqual(_localCasValue, localCasValue)) {
  145 + if (!isEqual(_localCasValue, localCasValue)) {
146 146 setLocalCasValue(_localCasValue);
147 147 }
148   - if (!_.isEqual(_localTextValue, localTextValue)) {
  148 + if (!isEqual(_localTextValue, localTextValue)) {
149 149 setLocalTextValue(_localTextValue);
150 150 }
151 151 }, [props.value]);
... ... @@ -191,10 +191,10 @@ const QxAddress: React.FC<FRWidgetProps> = (props) => {
191 191
192 192 const handleChange = (changeObj: any) => {
193 193 const newObj = { localCasValue, localTextValue, ...changeObj };
194   - if (!_.isEqual(localCasValue, newObj.localCasValue)) {
  194 + if (!isEqual(localCasValue, newObj.localCasValue)) {
195 195 setLocalCasValue(newObj.localCasValue);
196 196 }
197   - if (!_.isEqual(localTextValue, newObj.localTextValue)) {
  197 + if (!isEqual(localTextValue, newObj.localTextValue)) {
198 198 setLocalTextValue(newObj.localTextValue);
199 199 }
200 200
... ... @@ -248,7 +248,7 @@ const QxAddress: React.FC<FRWidgetProps> = (props) => {
248 248 />
249 249 {detail ? (
250 250 <Input
251   - disabled={props.disabled || _.isEmpty(localCasValue) || isDisabled}
  251 + disabled={props.disabled || isEmpty(localCasValue) || isDisabled}
252 252 // defaultValue={finalProps.textDefaultValue}
253 253 value={localTextValue}
254 254 style={{ marginTop: '10px' }}
... ...
1 1 import React, { useEffect, useState } from 'react';
2 2 import { Empty, Input, List, Modal, Tag } from 'antd';
3   -import { CheckOutlined, CloseOutlined, SearchOutlined } from '@ant-design/icons';
  3 +import { CheckOutlined, CloseOutlined } from '@ant-design/icons';
4 4 import { getPreviewSelect, getSelect } from '../service';
5 5 import VirtualList from 'rc-virtual-list';
6 6 import { ParamValueType } from '../../qx-filter-condition/filter';
... ... @@ -14,6 +14,7 @@ interface UserSelectProps {
14 14 getName: (str: string[]) => string;
15 15 modalClassName?: string | undefined; // 弹框类名自定义 用于自定义以及覆盖样式
16 16 }
  17 +import {QxBaseIcon} from '@qx/common';
17 18
18 19 const CONTAINER_HEIGHT = 300;
19 20
... ... @@ -273,8 +274,8 @@ export const RelSetter: React.FC<UserSelectProps> = ({
273 274 title="选择"
274 275 width={'640px'}
275 276 className={'qx-table-selector'}
276   - visible={visible}
277   - destroyOnClose={true}
  277 + open={visible}
  278 + destroyOnClose
278 279 onOk={handleOk}
279 280 onCancel={handleCancel}
280 281 wrapClassName={props?.modalClassName || ''}
... ... @@ -285,7 +286,7 @@ export const RelSetter: React.FC<UserSelectProps> = ({
285 286 className={'qx-selector-sub-search'}
286 287 placeholder={'输入关键字,回车搜索'}
287 288 allowClear
288   - prefix={<SearchOutlined />}
  289 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
289 290 onChange={handleChange}
290 291 onPressEnter={(e) => {
291 292 handleSearch(e);
... ...
1 1 import React, { useCallback, useEffect, useState } from 'react';
2 2 import { Empty, Input, Modal, Spin, Tag, Tree } from 'antd';
3   -import { CloseOutlined, SearchOutlined } from '@ant-design/icons';
  3 +import { CloseOutlined } from '@ant-design/icons';
4 4 import { getPreviewSelect, getSelect } from '../service';
5 5 import { ParamValueType } from '../../qx-filter-condition/filter';
  6 +import {QxBaseIcon} from '@qx/common';
6 7
7 8 interface UserSelectProps {
8 9 value?: string[];
... ... @@ -295,8 +296,8 @@ export const RelTreeSetter: React.FC<UserSelectProps> = ({
295 296 title="选择"
296 297 width={'640px'}
297 298 className={'qx-table-selector'}
298   - visible={visible}
299   - destroyOnClose={true}
  299 + open={visible}
  300 + destroyOnClose
300 301 onOk={handleOk}
301 302 onCancel={handleCancel}
302 303 wrapClassName={props?.modalClassName || ''}
... ... @@ -307,7 +308,7 @@ export const RelTreeSetter: React.FC<UserSelectProps> = ({
307 308 style={{ borderBottom: '1px solid #f0f0f0' }}
308 309 placeholder={'请输入关键字,按回车键搜索'}
309 310 allowClear
310   - prefix={<SearchOutlined />}
  311 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
311 312 onChange={(e) => {
312 313 handleChange(e);
313 314 }}
... ...
... ... @@ -196,10 +196,10 @@ export const UserSetter: React.FC<UserSelectProps> = ({
196 196 overlayClassName={'qx-pop-select'}
197 197 getPopupContainer={(triggerNode) => triggerNode}
198 198 arrowContent={false}
199   - visible={popVisible}
200   - onVisibleChange={handlePopVisibleChange}
  199 + open={popVisible}
  200 + onOpenChange={handlePopVisibleChange}
201 201 placement="bottom"
202   - trigger={disabled ? '' : 'click'}
  202 + trigger={disabled ? undefined : 'click'}
203 203 >
204 204 <div
205 205 style={style || {}}
... ...
... ... @@ -14,7 +14,7 @@ import moment from 'dayjs';
14 14 import type { MappingValueProps } from '../qx-filter-condition/filter';
15 15 import CodeEditor, { getAllVariable, VariableProps } from '../qx-code-editor';
16 16 import { CloseOutlined, ControlOutlined, RightOutlined } from '@ant-design/icons';
17   -import _ from 'lodash';
  17 +import { cloneDeep, isEqual, isEmpty, findIndex, size } from 'lodash-es';
18 18 import { RelTreeSetter } from './components/rel-tree-setter';
19 19 import { AddressSetter } from './components/address-setter';
20 20 import {QxFieldPopover} from '../qx-field-popover';
... ... @@ -185,11 +185,11 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
185 185 const currentElem = useRef<any>();
186 186 const [valueLocal, setValueLocal] = useState<MappingValueProps[]>();
187 187 useEffect(() => {
188   - setValueLocal(_.cloneDeep(value));
  188 + setValueLocal(cloneDeep(value));
189 189 }, [JSON.stringify(value)]);
190 190
191 191 useEffect(() => {
192   - const isSame = _.isEqual(value, valueLocal);
  192 + const isSame = isEqual(value, valueLocal);
193 193 if (!valueLocal || isSame) {
194 194 if (props.formula === 'MOD' && (valueLocal || []).length > 2) {
195 195 onChange((valueLocal || []).slice(0, 2));
... ... @@ -290,7 +290,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
290 290 index?: number,
291 291 isReplace?: boolean,
292 292 ) => {
293   - const valCp: string[] = _.cloneDeep(val);
  293 + const valCp: string[] = cloneDeep(val);
294 294 let valueFin: string[] = valCp;
295 295 if (isMultiTag) {
296 296 if (Boolean(isReplace)) {
... ... @@ -313,14 +313,14 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
313 313 }
314 314
315 315 if (isRange) {
316   - const oldVal = _.cloneDeep(valueLocal || []).map((v) => v.value) || [];
317   - oldVal[index || 0] = _.cloneDeep(valueFin)[0];
  316 + const oldVal = cloneDeep(valueLocal || []).map((v) => v.value) || [];
  317 + oldVal[index || 0] = cloneDeep(valueFin)[0];
318 318 valueFin = oldVal;
319 319 }
320 320 const mappingValuesNew: MappingValueProps[] = [];
321 321 (valueFin || []).map((v: string) => {
322 322 if (isMultiTag) {
323   - const i = _.findIndex(mappingValuesNew, (o: any) => {
  323 + const i = findIndex(mappingValuesNew, (o: any) => {
324 324 return o.type === valueType && o.value === v;
325 325 });
326 326 if (i > -1) {
... ... @@ -342,7 +342,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
342 342
343 343 const onFilterExtValueChange = (val: any) => {
344 344 setValueLocal((prevState) => {
345   - const valCp = _.cloneDeep(prevState);
  345 + const valCp = cloneDeep(prevState);
346 346 if (valCp && valCp?.length > 0) {
347 347 valCp[0].extVal = val || '';
348 348 }
... ... @@ -580,7 +580,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
580 580 * @param type
581 581 */
582 582 function getMappingValues(mValues: MappingValueProps[], type?: ParamValueType) {
583   - if (!mValues || _.size(mValues) === 0) {
  583 + if (!mValues || size(mValues) === 0) {
584 584 return [];
585 585 }
586 586 if (type) {
... ... @@ -592,7 +592,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
592 592 }
593 593
594 594 function getMappingExtValue(mValues: MappingValueProps[], type?: ParamValueType) {
595   - if (!mValues || _.size(mValues) === 0) {
  595 + if (!mValues || size(mValues) === 0) {
596 596 return [];
597 597 }
598 598 if (type) {
... ... @@ -767,7 +767,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
767 767 );
768 768
769 769 // "值选项集"按查询参数对应类型过滤
770   - const colsTreeCurr = _.cloneDeep(colsTree);
  770 + const colsTreeCurr = cloneDeep(colsTree);
771 771 // 是人员、组织、日期类型时,按类型过滤数据
772 772 let colsTreeProps = colsTreeCurr || [];
773 773 // 类型匹配处理,当前为只列出类型相同的属性 todo
... ... @@ -776,7 +776,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
776 776 }
777 777
778 778 // 禁用选项
779   - if (excludeKeys && _.size(excludeKeys) > 0) {
  779 + if (excludeKeys && size(excludeKeys) > 0) {
780 780 colsTreeProps = colsTreeProps?.filter((co: ColsTreeProps) => excludeKeys.includes(co.key));
781 781 colsTreeProps.map((col) => {
782 782 col.children = col?.children?.filter((co: ColsTreeProps) => excludeKeys.includes(co.key));
... ... @@ -1326,7 +1326,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
1326 1326 // 原值类型
1327 1327 let valueType: any;
1328 1328 // 查询原值(如果存在于`valueLocal`下)类型
1329   - const i = _.findIndex(valueLocal, (it) => {
  1329 + const i = findIndex(valueLocal, (it) => {
1330 1330 return it?.value === val[0];
1331 1331 });
1332 1332
... ... @@ -1519,7 +1519,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
1519 1519 }
1520 1520 placeholder="请输入日期(时间)"
1521 1521 defaultValue={
1522   - !_.isEmpty(getMappingExtValue(valueLocal || [], ParamValueType.MANUAL))
  1522 + !isEmpty(getMappingExtValue(valueLocal || [], ParamValueType.MANUAL))
1523 1523 ? moment(
1524 1524 getMappingExtValue(valueLocal || [], ParamValueType.MANUAL),
1525 1525 formatEnum[
... ... @@ -1533,7 +1533,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
1533 1533 : undefined
1534 1534 }
1535 1535 value={
1536   - !_.isEmpty(getMappingExtValue(valueLocal || [], ParamValueType.MANUAL))
  1536 + !isEmpty(getMappingExtValue(valueLocal || [], ParamValueType.MANUAL))
1537 1537 ? moment(
1538 1538 getMappingExtValue(valueLocal || [], ParamValueType.MANUAL),
1539 1539 formatEnum[
... ... @@ -1555,7 +1555,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
1555 1555 style={{ width: '100%', marginTop: '6px' }}
1556 1556 placeholder="请输入时间"
1557 1557 defaultValue={
1558   - !_.isEmpty(getMappingExtValue(valueLocal || [], ParamValueType.MANUAL))
  1558 + !isEmpty(getMappingExtValue(valueLocal || [], ParamValueType.MANUAL))
1559 1559 ? moment(
1560 1560 getMappingExtValue(valueLocal || [], ParamValueType.MANUAL),
1561 1561 formatEnum[
... ... @@ -1569,7 +1569,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
1569 1569 : undefined
1570 1570 }
1571 1571 value={
1572   - !_.isEmpty(getMappingExtValue(valueLocal || [], ParamValueType.MANUAL))
  1572 + !isEmpty(getMappingExtValue(valueLocal || [], ParamValueType.MANUAL))
1573 1573 ? moment(
1574 1574 getMappingExtValue(valueLocal || [], ParamValueType.MANUAL),
1575 1575 formatEnum[
... ... @@ -1594,7 +1594,7 @@ export const FieldSetter: React.FC<paramColSelectProps> = ({
1594 1594 }
1595 1595 onChange={(date, dateString) => {
1596 1596 setValueLocal((prevState) => {
1597   - let valCp: any = _.cloneDeep(prevState);
  1597 + let valCp: any = cloneDeep(prevState);
1598 1598 if (valCp && valCp?.length > 0) {
1599 1599 valCp[0].value = '__action_time';
1600 1600 valCp[0].extVal = dateString || '';
... ...
... ... @@ -5,9 +5,9 @@ import { FC, ReactElement, useEffect, useState } from 'react';
5 5 import type { OptionField } from '../type';
6 6 import { getUsefulFieldProp } from '../util';
7 7 import QxFieldItem from '../item';
8   -import { SearchOutlined } from '@ant-design/icons';
9 8 import './style.less';
10 9 import Checkbox from 'antd/es/checkbox/Checkbox';
  10 +import {QxBaseIcon} from '@qx/common';
11 11
12 12 interface QxFieldPopoverProp {
13 13 data: OptionField[];
... ... @@ -42,7 +42,7 @@ const FieldsCheckboxGroup: FC<FieldsCheckboxGroupProps> = (props) => {
42 42 className={'qx-selector-sub-search'}
43 43 placeholder={'请输入字段名'}
44 44 allowClear
45   - prefix={<SearchOutlined />}
  45 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
46 46 onChange={(e) => {
47 47 setKey(e.target.value.trim());
48 48 }}
... ... @@ -90,6 +90,7 @@ interface QxCheckboxFieldPopoverProp extends QxFieldPopoverProp {
90 90 isChecked: boolean,
91 91 ) => void;
92 92 values?: string[];
  93 + children?: any;
93 94 }
94 95
95 96 const QxCheckboxFieldPopover: React.FC<QxCheckboxFieldPopoverProp> = (props) => {
... ... @@ -131,13 +132,13 @@ const QxCheckboxFieldPopover: React.FC<QxCheckboxFieldPopoverProp> = (props) =>
131 132 <FieldsCheckboxGroup fields={fields} onChange={props.onChange} values={props.values} />
132 133 }
133 134 placement={'bottomRight'}
134   - trigger={props.disabled ? '' : props.trigger || 'hover'}
135   - visible={visible}
136   - onVisibleChange={(v) => {
  135 + trigger={props.disabled ? undefined : props.trigger || 'hover'}
  136 + open={visible}
  137 + onOpenChange={(v) => {
137 138 setVisible(v);
138 139 }}
139 140 >
140   - {props.children}
  141 + {props?.children}
141 142 </Popover>
142 143 );
143 144 };
... ...
... ... @@ -7,11 +7,10 @@ import type { OptionField } from '../type';
7 7 import { getUsefulFieldProp } from '../util';
8 8 // import {flatFields, getUsefulFieldProp} from '../util';
9 9 import QxFieldItem from '../item';
10   -// import classNames from "classnames";
11   -import { SearchOutlined } from '@ant-design/icons';
  10 +import {QxBaseIcon} from '@qx/common';
12 11 import './style.less';
13 12 import { useDebounceFn } from 'ahooks';
14   -import _ from 'lodash';
  13 +import { isEmpty } from 'lodash-es';
15 14
16 15 interface QxFieldPopoverProp {
17 16 data: OptionField[];
... ... @@ -55,7 +54,7 @@ const QxFieldPopover: React.FC<QxFieldPopoverProp> = (props) => {
55 54 });
56 55 };
57 56 useEffect(() => {
58   - if (!_.isEmpty(props.data)) {
  57 + if (!isEmpty(props.data)) {
59 58 const _fields = excludeFields(props.data);
60 59 setFields(_fields);
61 60 setFilterFields(_fields);
... ... @@ -132,7 +131,7 @@ const QxFieldPopover: React.FC<QxFieldPopoverProp> = (props) => {
132 131 className={'qx-selector-sub-search'}
133 132 placeholder={'搜索'}
134 133 allowClear
135   - prefix={<SearchOutlined />}
  134 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
136 135 style={{ paddingTop: '6px' }}
137 136 onChange={(e) => {
138 137 handleChange(e.target.value);
... ... @@ -242,13 +241,13 @@ const QxFieldPopover: React.FC<QxFieldPopoverProp> = (props) => {
242 241 // getPopupContainer={(triggerNode) => triggerNode}
243 242 content={fieldsPopContent()}
244 243 placement={'bottomRight'}
245   - trigger={props.disabled ? '' : props.trigger || 'hover'}
246   - visible={visible}
247   - onVisibleChange={(v) => {
  244 + trigger={props.disabled ? undefined : props.trigger || 'hover'}
  245 + open={visible}
  246 + onOpenChange={(v) => {
248 247 setVisible(v);
249 248 }}
250 249 >
251   - {props.children}
  250 + {props?.children}
252 251 </Popover>
253 252 );
254 253 };
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .qx-fields-popover {
2 4 padding-top: 0;
3 5
... ... @@ -22,7 +24,7 @@
22 24 cursor: pointer;
23 25
24 26 &:hover {
25   - background-color: @item-hover-bg;
  27 + background-color: @N3;
26 28 }
27 29 }
28 30 }
... ... @@ -35,7 +37,7 @@
35 37 &.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title {
36 38 margin-top: 0;
37 39 margin-bottom: 1px;
38   - background-color: #fafafa;
  40 + background-color: @N2;
39 41 }
40 42
41 43 .ant-menu-sub.ant-menu-inline {
... ... @@ -50,7 +52,7 @@
50 52
51 53 &:hover {
52 54 color: inherit;
53   - background-color: @item-hover-bg;
  55 + background-color: @N3;
54 56 }
55 57 }
56 58 }
... ... @@ -58,5 +60,5 @@
58 60 padding-top: 5px;
59 61 padding-bottom: 5px;
60 62 padding-left: 24px;
61   - border-top: 1px solid #f0f0f0;
  63 + border-top: 1px solid @N4;
62 64 }
... ...
... ... @@ -2,7 +2,7 @@ import { Input, Popover, Tree } from 'antd';
2 2 import React from 'react';
3 3 import { FC, ReactElement, useEffect, useState } from 'react';
4 4 import type { OptionField } from '../type';
5   -import { SearchOutlined } from '@ant-design/icons';
  5 +import {QxBaseIcon} from '@qx/common';
6 6 import './style.less';
7 7
8 8 interface QxFieldPopoverProp {
... ... @@ -29,8 +29,8 @@ const ParametersTreeGroup: FC<FieldsCheckboxGroupProps> = (props) => {
29 29 const [keyword, setKey] = useState('');
30 30
31 31 const [autoExpandParent, setAutoExpandParent] = useState<boolean>(true);
32   - const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);
33   - const [checkedKeys, setCheckedKeys] = useState<React.Key[]>([]);
  32 + const [expandedKeys, setExpandedKeys] = useState<any>([]);
  33 + const [checkedKeys, setCheckedKeys] = useState<any>([]);
34 34
35 35 const [treeData, setTreeData] = useState<any[]>([]);
36 36
... ... @@ -67,7 +67,7 @@ const ParametersTreeGroup: FC<FieldsCheckboxGroupProps> = (props) => {
67 67 setAutoExpandParent(false);
68 68 };
69 69
70   - const onCheck = (checkedKeysValue: React.Key[], Item: any) => {
  70 + const onCheck = (checkedKeysValue: any, Item: any) => {
71 71 console.log('onCheck', checkedKeysValue, Item, checkedKeysValue?.checked);
72 72 setCheckedKeys(checkedKeysValue);
73 73 const chooseId = Item?.node?.id;
... ... @@ -83,7 +83,7 @@ const ParametersTreeGroup: FC<FieldsCheckboxGroupProps> = (props) => {
83 83
84 84 const KeysArr: any[] = [];
85 85 const loop = (data: any): any =>
86   - data.map((item) => {
  86 + data.map((item: any) => {
87 87 const strTitle = item.title as string;
88 88 const index = strTitle.indexOf(keyword);
89 89 const beforeStr = strTitle.substring(0, index);
... ... @@ -123,7 +123,7 @@ const ParametersTreeGroup: FC<FieldsCheckboxGroupProps> = (props) => {
123 123 className={'qx-selector-sub-search'}
124 124 placeholder={'请输入参数名称搜索'}
125 125 allowClear
126   - prefix={<SearchOutlined />}
  126 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
127 127 onChange={(e) => {
128 128 setKey(e.target.value.trim());
129 129 }}
... ... @@ -152,6 +152,7 @@ const ParametersTreeGroup: FC<FieldsCheckboxGroupProps> = (props) => {
152 152 interface QxTreeParameterPopoverProp extends QxFieldPopoverProp {
153 153 onChange: (selectedKey: string, selectedItem: OptionField, isChecked: boolean) => void;
154 154 values?: string[];
  155 + children?: any;
155 156 }
156 157
157 158 const QxTreeParameterPopover: React.FC<QxTreeParameterPopoverProp> = (props) => {
... ... @@ -172,7 +173,7 @@ const QxTreeParameterPopover: React.FC<QxTreeParameterPopoverProp> = (props) =>
172 173 // console.log(props.data);
173 174 if (props.data) {
174 175 const _fields = excludeFields(props?.data);
175   - setFields(_fields);
  176 + setFields(_fields || []);
176 177 }
177 178 }, [props.data]);
178 179
... ... @@ -183,13 +184,13 @@ const QxTreeParameterPopover: React.FC<QxTreeParameterPopoverProp> = (props) =>
183 184 <ParametersTreeGroup fields={fields} onChange={props.onChange} values={props.values} />
184 185 }
185 186 placement={'bottomRight'}
186   - trigger={props.disabled ? '' : props.trigger || 'hover'}
187   - visible={visible}
188   - onVisibleChange={(v) => {
  187 + trigger={props.disabled ? undefined : props.trigger || 'hover'}
  188 + open={visible}
  189 + onOpenChange={(v) => {
189 190 setVisible(v);
190 191 }}
191 192 >
192   - {props.children}
  193 + {props?.children}
193 194 </Popover>
194 195 );
195 196 };
... ...
... ... @@ -87,7 +87,7 @@ const QxFieldSelect: React.FC = (props: any) => {
87 87 useEffect(() => {
88 88 if (schemaProps && !schemaProps.data && schemaProps.params && fields.length === 0) {
89 89 const { ...otherParams } = schemaProps.params;
90   - getFieldOptions(appCode, funCode, otherParams).then((res) => {
  90 + getFieldOptions(appCode, funCode, otherParams).then((res: any) => {
91 91 setFields(includeFields(res));
92 92 });
93 93 } else if (schemaProps && schemaProps.data) {
... ... @@ -126,7 +126,7 @@ const QxFieldSelect: React.FC = (props: any) => {
126 126 // @ts-ignore
127 127 return (
128 128 ((fields || []) as any)
129   - .filter((field) => field.code === option.key)[0]
  129 + .filter((field: { code: string }) => field.code === option.key)[0]
130 130 .name?.indexOf(input) > -1
131 131 );
132 132 }
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .select_mask {
2 4 position: absolute;
3 5 z-index: 9;
4 6 width: 100%;
5 7 height: 100%;
6 8 text-align: center;
7   - background-color: @red-1;
8   - border: 1px solid @btn-danger-border;
9   - border-radius: @btn-border-radius-base;
  9 + background-color: @E1;
  10 + border: 1px solid @E2;
  11 + border-radius: 4px;
10 12 pointer-events: none;
11 13 }
12 14
13 15 .select_mask_text {
14 16 z-index: 13;
15   - color: @error-color;
  17 + color: @E3;
16 18 font-size: 14px;
17 19 line-height: 30px;
18 20 text-align: center;
... ...
... ... @@ -29,7 +29,7 @@ export const getUsefulFieldProp = (field: any) => {
29 29 * @param excludeWidgets
30 30 */
31 31 export const flatFields = (fields: WidgetField[] | OptionField[], excludeWidgets?: string[]) => {
32   - const fieldFlatten = {};
  32 + const fieldFlatten: any = {};
33 33 fields.forEach((field: any) => {
34 34 const { code, widget } = getUsefulFieldProp(field);
35 35 if (excludeWidgets && excludeWidgets.indexOf(widget) > -1) {
... ...
  1 +import React, { useCallback, useRef } from 'react';
1 2 import { BlockOutlined } from '@ant-design/icons';
2 3 import { useSetState } from 'ahooks';
3 4 import { Button } from 'antd';
4 5 import cls from 'classnames';
5   -import React, { useCallback, useRef } from 'react';
6 6 import { QxAppSelector } from '../qx-app-selector';
7 7 import type { InputSelectProps } from '../qx-input-select';
8 8 import { QxInputSelect } from '../qx-input-select';
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 @prefix: ~'qx-datasource-select';
2 4
3 5 .@{prefix} {
... ... @@ -8,6 +10,6 @@
8 10 height: 50px !important;
9 11 text-align: left !important;
10 12 background-color: #fff !important;
11   - border-top: 1px solid #e6eaf2 !important;
  13 + border-top: 1px solid @N4 !important;
12 14 }
13 15 }
... ...
... ... @@ -2,9 +2,9 @@ import * as React from 'react';
2 2 import { useCallback, useEffect, useImperativeHandle, useState } from 'react';
3 3 import { Checkbox, Empty, Input, Spin } from 'antd';
4 4 import Menu from 'antd/es/menu';
5   -import { SearchOutlined } from '@ant-design/icons';
  5 +import {QxBaseIcon} from '@qx/common';
6 6 import { getGroups } from './service';
7   -import _ from 'lodash';
  7 +import { cloneDeep } from 'lodash-es';
8 8
9 9 type GroupCoreProps = {
10 10 appId?: string;
... ... @@ -144,7 +144,7 @@ const GroupSelCore: React.FC<GroupCoreProps> = ({
144 144 };
145 145
146 146 if (data) {
147   - const _data = _.cloneDeep(data);
  147 + const _data = cloneDeep(data);
148 148 _data.forEach((item) => {
149 149 traverse(item);
150 150 });
... ... @@ -189,7 +189,7 @@ const GroupSelCore: React.FC<GroupCoreProps> = ({
189 189 className={'qx-selector-sub-search'}
190 190 placeholder={placeholder || '请输入群组名称,按回车键搜索'}
191 191 allowClear
192   - prefix={<SearchOutlined />}
  192 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
193 193 onChange={(e) => {
194 194 handleChange(e);
195 195 }}
... ...
1   -import { SearchOutlined } from '@ant-design/icons';
2   -import { useScroll } from 'ahooks';
3   -import { Empty, Input, Menu, Spin } from 'antd';
4   -import cls from 'classnames';
5   -import { debounce } from 'lodash';
6 1 import React, {
7 2 memo,
8 3 useCallback,
... ... @@ -11,6 +6,11 @@ import React, {
11 6 useRef,
12 7 useState,
13 8 } from 'react';
  9 +import {QxBaseIcon} from '@qx/common';
  10 +import { useScroll } from 'ahooks';
  11 +import { Empty, Input, Menu, Spin } from 'antd';
  12 +import cls from 'classnames';
  13 +import { debounce } from 'lodash-es';
14 14 import './styles.less';
15 15 const prefix = 'qx-input-select-dropdown';
16 16
... ... @@ -115,7 +115,7 @@ const DropdownContent = React.forwardRef<any, DropdownContentProps>(
115 115 {showSearch ? (
116 116 <Input
117 117 placeholder={placeholder || '输入名称搜索'}
118   - prefix={<SearchOutlined />}
  118 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
119 119 className={`${prefix}__input`}
120 120 onChange={onSearch}
121 121 />
... ...
... ... @@ -62,11 +62,11 @@ export const QxInputSelect = React.forwardRef<any, InputSelectProps>(
62 62 return (
63 63 <div className={cls(prefix, className)}>
64 64 <Dropdown
65   - visible={state.visible}
  65 + open={state.visible}
66 66 destroyPopupOnHide
67 67 trigger={['click']}
68 68 className={`${prefix}__dropdown`}
69   - overlay={() => (
  69 + dropdownRender={() => (
70 70 <DropdownContent
71 71 options={options}
72 72 onChange={handleChange}
... ... @@ -74,7 +74,7 @@ export const QxInputSelect = React.forwardRef<any, InputSelectProps>(
74 74 />
75 75 )}
76 76 getPopupContainer={(triggerNode) => triggerNode}
77   - onVisibleChange={onVisibleChange}
  77 + onOpenChange={onVisibleChange}
78 78 disabled={disabled}
79 79 >
80 80 <Input
... ...
... ... @@ -31,7 +31,7 @@
31 31 margin-bottom: 0;
32 32
33 33 &:hover {
34   - background-color: #f5f5f5;
  34 + background-color: @N3;
35 35 }
36 36 }
37 37 }
... ... @@ -54,7 +54,7 @@
54 54 padding-bottom: 5px !important;
55 55 padding-left: 0 !important;
56 56 border: none !important;
57   - border-bottom: 1px solid #e6eaf2 !important;
  57 + border-bottom: 1px solid @N4 !important;
58 58 outline: none !important;
59 59 box-shadow: none !important;
60 60
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .qx-search-tree__wrap {
2 4 height: 100%;
3 5 overflow: auto;
... ... @@ -8,8 +10,8 @@
8 10
9 11 .ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected {
10 12 // TODO 主题色更改 颜色暂时写死
11   - color: #1764ff;
12   - background-color: #e6f7ff;
  13 + color: @B8;
  14 + background-color: @B3;
13 15 }
14 16 }
15 17
... ...
... ... @@ -3,8 +3,9 @@ import { useCallback, useEffect, useImperativeHandle, useState } from 'react';
3 3 import { Empty, Input, Spin, Tooltip, Tree } from 'antd';
4 4 import './core.less';
5 5 import { getOrgTree } from './service';
6   -import _ from 'lodash';
7   -import { PartitionOutlined, SearchOutlined } from '@ant-design/icons';
  6 +import { cloneDeep } from 'lodash-es';
  7 +import { PartitionOutlined } from '@ant-design/icons';
  8 +import {QxBaseIcon} from '@qx/common';
8 9
9 10 type OrgCoreProps = {
10 11 cRef?: any;
... ... @@ -243,7 +244,7 @@ const OrgCore: React.FC<OrgCoreProps> = (props) => {
243 244 };
244 245
245 246 if (data) {
246   - const _data = _.cloneDeep(data);
  247 + const _data = cloneDeep(data);
247 248 if (word != '') {
248 249 traverse(_data);
249 250 }
... ... @@ -301,7 +302,7 @@ const OrgCore: React.FC<OrgCoreProps> = (props) => {
301 302 className={'qx-selector-sub-search'}
302 303 placeholder={props.placeholder || '请输入部门名称,按回车键搜索'}
303 304 allowClear
304   - prefix={<SearchOutlined />}
  305 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
305 306 onChange={(e) => {
306 307 handleChange(e);
307 308 }}
... ...
1   -import * as React from 'react';
2   -import { useEffect, useRef, useState } from 'react';
  1 +import React, { useEffect, useRef, useState } from 'react';
3 2 import { Modal, Tag } from 'antd';
4 3 import OrgCore from './core';
5 4
... ... @@ -56,7 +55,7 @@ const OrgSelectorDialog: React.FC<OrgSelectorDialogProps> = (props) => {
56 55 <Modal
57 56 title={props.title || '选择部门'}
58 57 width={560}
59   - visible={props.visible}
  58 + open={props.visible}
60 59 className={'qx-org-selector__dialog'}
61 60 onOk={handleOk}
62 61 onCancel={handleCancel}
... ...
... ... @@ -103,7 +103,7 @@ const QxOrgSelector: React.FC<QxOrgSelectorProps> = (props) => {
103 103 }, [JSON.stringify(props.defaultData)]);
104 104
105 105 // getUserList()
106   - const handleOk = (keys: [], data: []) => {
  106 + const handleOk = (keys: any[], data: any[]) => {
107 107 let _value: [] | string = keys;
108 108 if (!props.multiple && keys && keys.length > 0) {
109 109 // @ts-ignore
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .qx-org-selector {
2 4 padding-left: 8px;
3 5 line-height: 0;
... ... @@ -55,7 +57,7 @@
55 57
56 58 .qx-selector-sub-search.ant-input-affix-wrapper {
57 59 margin-bottom: 8px;
58   - border-bottom: 1px solid #f0f0f0;
  60 + border-bottom: 1px solid @N4;
59 61 }
60 62 }
61 63
... ... @@ -68,7 +70,7 @@
68 70 height: 60px;
69 71 padding: 5px;
70 72 overflow: auto;
71   - border-bottom: 1px solid #f0f0f0;
  73 + border-bottom: 1px solid @N4;
72 74
73 75 .ant-tag {
74 76 margin: 1px 2px;
... ... @@ -82,14 +84,14 @@
82 84
83 85 .qx-org-tree__include {
84 86 margin-left: 10px;
85   - color: #999;
  87 + color: @N7;
86 88 font-size: 16px;
87 89
88 90 &:hover {
89   - color: #333;
  91 + color: @N9;
90 92 }
91 93
92 94 .active {
93   - color: #1890ff;
  95 + color: @B8;
94 96 }
95 97 }
... ...
... ... @@ -3,7 +3,6 @@
3 3 import {
4 4 DeleteOutlined,
5 5 PlusOutlined,
6   - SearchOutlined,
7 6 SisternodeOutlined,
8 7 SnippetsOutlined,
9 8 } from '@ant-design/icons';
... ... @@ -40,8 +39,10 @@ import { formatEnum } from './constant';
40 39 // typeTranslateItemtype,
41 40 // } from './constant';
42 41 // import { Controlled as CodeMirror } from 'react-codemirror2'
43   -import _ from 'lodash';
  42 +import { cloneDeep } from 'lodash-es';
44 43 import moment from 'dayjs';
  44 +import {QxBaseIcon} from '@qx/common';
  45 +
45 46 const valueOptions = [
46 47 { key: 'STRING', title: '文本' },
47 48 { key: 'NUMBER', title: '数字' },
... ... @@ -125,7 +126,7 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => {
125 126
126 127 //判断数组是否只有一个子节点
127 128 const checkShowAdd = (_data: any) => {
128   - const _newTreeData = _.cloneDeep(treeData);
  129 + const _newTreeData = cloneDeep(treeData);
129 130 if (!!_data.pid) {
130 131 const pidIndex = _newTreeData.findIndex(
131 132 (item: any) => item.id === _data.pid,
... ... @@ -870,7 +871,7 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => {
870 871 const dropId =
871 872 dropCol.getAttribute('data-row-key') ||
872 873 dropCol.getAttribute('id')?.slice(4);
873   - const _newTreeData = _.cloneDeep(treeData);
  874 + const _newTreeData = cloneDeep(treeData);
874 875 const dragIndex = _newTreeData.findIndex(
875 876 (item: any) => item.id === dragId,
876 877 ); //要drop的index
... ... @@ -947,7 +948,7 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => {
947 948 <>
948 949 <Modal
949 950 title="高级参数设计器"
950   - visible={visible}
  951 + open={visible}
951 952 destroyOnClose
952 953 footer={null}
953 954 // onOk={handleCancel}
... ... @@ -986,7 +987,7 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => {
986 987 <Input
987 988 className={'qx-parameter-setting--search'}
988 989 placeholder="按名称搜索"
989   - prefix={<SearchOutlined />}
  990 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
990 991 onChange={onChange}
991 992 style={{ width: 219 }}
992 993 />
... ... @@ -1019,11 +1020,12 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => {
1019 1020 // <Form form={form}>
1020 1021 <Table
1021 1022 components={components}
1022   - defaultExpandAllRows
  1023 + expandable={{
  1024 + defaultExpandAllRows: true,
  1025 + childrenColumnName: 'child'
  1026 + }}
1023 1027 onRow={() => onRow()}
1024 1028 scroll={{ x: 1600 }}
1025   - childrenColumnName={'child'}
1026   - // className={'param-setting-table'}
1027 1029 rowClassName={() => 'editable-row'}
1028 1030 bordered
1029 1031 pagination={false}
... ...
... ... @@ -585,4 +585,5 @@ export interface ParamDesignModel extends DataNode {
585 585 title?: string;
586 586 qxProps?: any;
587 587 child?: ParamDesignModel[];
  588 + mappingValues?: any;
588 589 }
... ...
... ... @@ -5,7 +5,6 @@ import React, { useCallback, useEffect, useState } from 'react';
5 5 import {
6 6 DeleteOutlined,
7 7 PlusOutlined,
8   - SearchOutlined,
9 8 SettingOutlined,
10 9 } from '@ant-design/icons';
11 10 import {
... ... @@ -30,10 +29,12 @@ import { formatEnum } from './constant';
30 29 // typeTranslateItemtype,
31 30 // } from './constant';
32 31
33   -import _ from 'lodash';
  32 +import { cloneDeep } from 'lodash-es';
34 33 import moment from 'dayjs';
35 34 import type { ParamDesignModel } from './constant';
36 35 import { uidGen } from './stringUtil';
  36 +import {QxBaseIcon} from '@qx/common';
  37 +
37 38 import './style.less';
38 39
39 40 const valueOptions = [
... ... @@ -106,7 +107,7 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
106 107
107 108 useEffect(() => {
108 109 if (props?.value?.length > 0) {
109   - const value = _.cloneDeep(props?.value);
  110 + const value = cloneDeep(props?.value);
110 111 const expandedArray: any = [];
111 112 (value || []).map((_item: ParamDesignModel) => {
112 113 expandedArray.push(_item.id);
... ... @@ -115,7 +116,7 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
115 116 setTreeData(value);
116 117 // const newData = generateTreeData(value, '')
117 118 const Treelist = generateList(value);
118   - const newList = _.cloneDeep(Treelist);
  119 + const newList = cloneDeep(Treelist);
119 120 newList.map((_item) => {
120 121 delete _item.child;
121 122 });
... ... @@ -153,7 +154,7 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
153 154 data: ParamDesignModel,
154 155 // newType: string,
155 156 ) => {
156   - let treeList = _.cloneDeep(list);
  157 + let treeList = cloneDeep(list);
157 158 // todo 编辑重名bug 貌似有点问题 待修改
158 159 treeList = (treeList || []).filter((item) => item.id != data.id);
159 160 if (!treeList || treeList.length == 0) {
... ... @@ -217,7 +218,7 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
217 218
218 219 const isProps = code.indexOf('qxProps');
219 220 const _newCode = isProps > -1 ? code.slice(8) : '';
220   - const _newData = _.cloneDeep(treeData);
  221 + const _newData = cloneDeep(treeData);
221 222 if (code == 'code') {
222 223 data.code = value;
223 224 const codeValid = validateCode(data);
... ... @@ -290,7 +291,7 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
290 291 okText: '确认',
291 292 okType: 'danger',
292 293 onOk: () => {
293   - const listData = _.cloneDeep(treeData);
  294 + const listData = cloneDeep(treeData);
294 295 // const newData = generateTreeData(listData, '');
295 296 const loopDeleteTree = (treeList: ParamDesignModel[]) => {
296 297 for (let i = 0; i < treeList.length; i++) {
... ... @@ -334,7 +335,7 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
334 335 }
335 336 };
336 337
337   - let data = _.cloneDeep(treeData);
  338 + let data = cloneDeep(treeData);
338 339 // Find dragObject
339 340 let dragObj: ParamDesignModel;
340 341 loop(data, dragKey, (item, index, arr) => {
... ... @@ -525,8 +526,8 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
525 526 // return undefined;
526 527 // };
527 528
528   - const changeField = (val: string, data: amy) => {
529   - const _newData = _.cloneDeep(treeData);
  529 + const changeField = (val: any, data: any) => {
  530 + const _newData = cloneDeep(treeData);
530 531 const _qxProps = {};
531 532
532 533 const loopChangeTree = (treeList: ParamDesignModel[]) => {
... ... @@ -543,8 +544,8 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
543 544 treeList[i].mappingValues = [val[0].value];
544 545 }
545 546 return;
546   - } else if (treeList[i].child) {
547   - loopChangeTree(treeList[i].child);
  547 + } else if (!!treeList[i]?.child?.length) {
  548 + loopChangeTree(treeList[i].child || []);
548 549 }
549 550 }
550 551 };
... ... @@ -663,13 +664,11 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
663 664 <Dropdown
664 665 trigger={['click']}
665 666 className={'hidden-select'}
666   - overlay={
667   - <Menu
668   - items={valueOptions}
669   - className={'dropdown'}
670   - onClick={onSelect}
671   - />
672   - }
  667 + menu={{
  668 + items: valueOptions,
  669 + className: 'dropdown',
  670 + onClick: onSelect
  671 + }}
673 672 >
674 673 <Button type={'link'}>
675 674 <PlusOutlined />
... ... @@ -690,7 +689,7 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => {
690 689 <Input
691 690 className={'qx-parameter-setting--search'}
692 691 placeholder="按名称搜索"
693   - prefix={<SearchOutlined />}
  692 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
694 693 onChange={onChange}
695 694 />
696 695 )}
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 /* stylelint-disable declaration-block-no-redundant-longhand-properties */
2 4 .border-none .ant-select:not(.ant-select-customize-input) .ant-select-selector {
3 5 border: none;
... ... @@ -10,22 +12,6 @@
10 12 flex-direction: row-reverse;
11 13 flex-wrap: nowrap;
12 14 justify-content: space-between;
13   - // flex-shrink:0;
14   - // min-height: 32px;
15   - // padding: 1px;
16   - // position: 'relative', display: 'flex', flexWrap: 'wrap'
17   -
18   - // > .ant-tag {
19   - // margin: 3px;
20   -
21   - // &:first-child {
22   - // margin-left: 10px;
23   - // }
24   -
25   - // ~ .qx-tags-input__box {
26   - // padding-left: 5px;
27   - // }
28   - // }
29 15 }
30 16
31 17 .tree-wrapper {
... ... @@ -36,7 +22,7 @@
36 22 border-radius: 4px;
37 23
38 24 &:hover {
39   - background-color: #f4f4f5;
  25 + background-color: @N3;
40 26 }
41 27 }
42 28
... ... @@ -49,24 +35,6 @@
49 35 }
50 36 }
51 37
52   -// .ant-tree-node-selected:hover ~ .ant-tree-treenode:hover{
53   -// background-color: #bae7ff !important;
54   -// }
55   -
56   -// .ant-tree-node-content-wrapper :hover ~ .ant-tree-treenode{
57   -// // background-color: #F4F4F5;
58   -// // padding-top: 4px;
59   -// }
60   -
61   -// .tree-list :hover{
62   -// background-color: #ff72;
63   -// }
64   -
65   -// .ant-tree .ant-tree-treenode :hover{
66   -// background-color: #00f;
67   -// border-radius:4px;
68   -// }
69   -
70 38 .border-none
71 39 .ant-select-focused:not(.ant-select-disabled).ant-select:not(
72 40 .ant-select-customize-input
... ... @@ -98,7 +66,7 @@
98 66 color: #666;
99 67
100 68 &:hover {
101   - color: red;
  69 + color: @E3;
102 70 opacity: 1;
103 71 }
104 72 }
... ... @@ -131,7 +99,7 @@
131 99 // min-width: 100px;
132 100 margin-bottom: 2px;
133 101 overflow: hidden;
134   - text-overflow: ellipsi;
  102 + text-overflow: ellipsis;
135 103 }
136 104
137 105 .opt-left-down {
... ... @@ -145,7 +113,7 @@
145 113 margin-top: 2px;
146 114 margin-bottom: 2px;
147 115 overflow: hidden;
148   - text-overflow: ellipsi;
  116 + text-overflow: ellipsis;
149 117 }
150 118
151 119 // .ant-tree-node-content-wrapper :hover .select-tree {
... ... @@ -237,13 +205,13 @@
237 205
238 206 .btn-high-del {
239 207 &:hover {
240   - color: red !important;
  208 + color: @E3 !important;
241 209 }
242 210 }
243 211
244 212 .editable-row:hover .editable-cell-value-wrap {
245 213 padding: 4px 11px;
246   - border: 1px solid #d9d9d9;
  214 + border: 1px solid @N4;
247 215 border-radius: 2px;
248 216 }
249 217
... ... @@ -306,41 +274,6 @@
306 274 text-align: center !important;
307 275 }
308 276
309   -//TODO 写法不行
310   -// #root .hidden-select {
311   -// .ant-select-tree
312   -// .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected {
313   -// // background-color: #bae7ff;
314   -// background-color: @primary-2;
315   -// }
316   -// }
317   -// .ant-form-item
318   -// .qx-parameter-setting__tree-list {
319   -// .ant-tree-draggable-icon {
320   -// line-height: 32px;
321   -// }
322   -
323   -// &.ant-tree
324   -// .ant-tree-treenode:not(.ant-tree-treenode-disabled)
325   -// .ant-tree-node-content-wrapper {
326   -// border-radius: 4px;
327   -
328   -// &.ant-tree-node-selected {
329   -// background-color: transparent;
330   -// }
331   -
332   -// &:hover,
333   -// &.ant-tree-node-selected:hover {
334   -// background-color: @N3;
335   -// // opacity: 1 !important;
336   -// // background-color: #91d5ff;
337   -// }
338   -// }
339   -// }
340   -
341   -// .ant-form-item{
342   -// margin-bottom: 0;
343   -// }
344 277
345 278 .json-editor {
346 279 width: 90%;
... ...
... ... @@ -2,8 +2,8 @@ import * as React from 'react';
2 2 import { useCallback, useEffect, useImperativeHandle, useState } from 'react';
3 3 import { Checkbox, Empty, Input, Spin } from 'antd';
4 4 import { getPositions } from './service';
5   -import _ from 'lodash';
6   -import { SearchOutlined } from '@ant-design/icons';
  5 +import { cloneDeep } from 'lodash-es';
  6 +import {QxBaseIcon} from '@qx/common';
7 7 import Menu from 'antd/es/menu';
8 8
9 9 type PosCoreProps = {
... ... @@ -143,7 +143,7 @@ const PosCore: React.FC<PosCoreProps> = (props) => {
143 143 };
144 144
145 145 if (data) {
146   - const _data = _.cloneDeep(data);
  146 + const _data = cloneDeep(data);
147 147 _data.forEach((item) => {
148 148 traverse(item);
149 149 });
... ... @@ -186,7 +186,7 @@ const PosCore: React.FC<PosCoreProps> = (props) => {
186 186 className={'qx-selector-sub-search'}
187 187 placeholder={props.placeholder || '请输入岗位名称,按回车键搜索'}
188 188 allowClear
189   - prefix={<SearchOutlined />}
  189 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
190 190 onChange={(e) => {
191 191 handleChange(e);
192 192 }}
... ...
... ... @@ -52,7 +52,7 @@ const PosSelectorDialog: React.FC<PosSelectorDialogProps> = (props) => {
52 52 <Modal
53 53 title={props.title || '选择岗位'}
54 54 width={560}
55   - visible={props.visible}
  55 + open={props.visible}
56 56 className={'qx-pos-selector__dialog'}
57 57 onOk={handleOk}
58 58 onCancel={handleCancel}
... ...
... ... @@ -32,7 +32,7 @@ const QxPosSelector: React.FC<QxPosSelectorProps> = (props) => {
32 32 }, []);
33 33
34 34 // getUserList()
35   - const handleOk = (keys: [], data: []) => {
  35 + const handleOk = (keys: [], data: any[]) => {
36 36 let _value: [] | string = keys;
37 37 if (!props.multiple && keys && keys.length > 0) {
38 38 // @ts-ignore
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .qx-pos-selector__dialog {
2 4 //.ant-popover-arrow {
3 5 // display: none;
... ... @@ -27,7 +29,7 @@
27 29 height: 60px;
28 30 padding: 5px;
29 31 overflow: auto;
30   - border-bottom: 1px solid #f0f0f0;
  32 + border-bottom: 1px solid @N4;
31 33
32 34 .ant-tag {
33 35 margin: 1px 2px;
... ...
... ... @@ -85,7 +85,7 @@ const QxPagination: React.FC<QxPaginationProps> = (props) => {
85 85 <Popover
86 86 overlayClassName={'qx-pagination__overlay'}
87 87 content={pageContent}
88   - trigger={total === 0 ? '' : 'click'}
  88 + trigger={total === 0 ? undefined : 'click'}
89 89 placement={'bottom'}
90 90 >
91 91 <li className={'ant-pagination-simple-pager'}>
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .qx-pagination {
2 4 > .anticon {
3   - color: rgba(0, 0, 0, 0.25);
  5 + color: @N7;
4 6 }
5 7
6 8 .ant-pagination-simple-pager {
7 9 cursor: pointer;
8 10
9 11 &:hover {
10   - color: #007ef3;
  12 + color: @B8;
11 13 }
12 14 }
13 15 }
... ...
... ... @@ -2,9 +2,7 @@ import * as React from 'react';
2 2 import { useCallback, useEffect, useState } from 'react';
3 3 import { Empty, Input, Spin} from 'antd';
4 4 import { getAllRole } from '../service';
5   -import {
6   - SearchOutlined,
7   -} from '@ant-design/icons';
  5 +import {QxBaseIcon} from '@qx/common';
8 6 import Menu from 'antd/es/menu';
9 7
10 8 type RoleProps = {
... ... @@ -188,7 +186,7 @@ const Role: React.FC<RoleProps> = (props) => {
188 186 className={'qx-selector-sub-search'}
189 187 placeholder={props.placeholder || '请输入角色名称,按回车键搜索'}
190 188 allowClear
191   - prefix={<SearchOutlined />}
  189 + prefix={<QxBaseIcon type={'icon-app-search-line'} />}
192 190 onChange={(e) => {
193 191 handleChange(e);
194 192 }}
... ...
... ... @@ -6,7 +6,7 @@ import { Checkbox, Empty, Input, Spin } from 'antd';
6 6 // import { InputRef } from 'antd/es/input';
7 7 import QxPagination from './qx-pagination';
8 8 import type { CheckboxChangeEvent } from 'antd/es/checkbox';
9   -import { SearchOutlined } from '@ant-design/icons';
  9 +import {QxBaseIcon} from '@qx/common';
10 10 // import type { InputRef } from 'antd/lib/input';
11 11
12 12 type UserItem = { id: string; name: string; code: string; relName?: string };
... ... @@ -202,7 +202,7 @@ const UserList: React.FC<UserListProps> = (props) => {
202 202 }}
203 203 onChange={(e) => handleChange(e)}
204 204 allowClear
205   - prefix={<SearchOutlined style={{ color: 'rgba(0,0,0,.45)' }} />}
  205 + prefix={<QxBaseIcon style={{ color: 'rgba(0,0,0,.45)' }} type={'icon-app-search-line'} />}
206 206 />
207 207 </div>
208 208 <QxPagination
... ...
... ... @@ -222,7 +222,7 @@ const UserSelectorDialog: React.FC<UserSelectorDialogProps> = (props) => {
222 222 <Modal
223 223 title={dialogTitle}
224 224 width={700}
225   - visible={props.visible}
  225 + open={props.visible}
226 226 className={'qx-user-selector__dialog'}
227 227 onOk={handleOk}
228 228 onCancel={handleCancel}
... ...
... ... @@ -6,7 +6,7 @@ import './style.less';
6 6 import type { UserItem } from './dialog';
7 7 import UserSelectorDialog from './dialog';
8 8 import { searchUserByAllType, SearchUserAllData } from './service';
9   -import _ from 'lodash';
  9 +import { debounce } from 'lodash-es';
10 10
11 11 export type QxUserSelectorProps = {
12 12 cRef?: any;
... ... @@ -266,7 +266,7 @@ const QxUserSelector: React.FC<QxUserSelectorProps> = (props) => {
266 266 }
267 267 }, [popVisible]);
268 268
269   - const handleSearch = _.debounce((_keywords: string | undefined) => {
  269 + const handleSearch = debounce((_keywords: string | undefined) => {
270 270 if (!_keywords) {
271 271 setUserList(null);
272 272 return;
... ... @@ -384,12 +384,12 @@ const QxUserSelector: React.FC<QxUserSelectorProps> = (props) => {
384 384 <Popover
385 385 content={userDropContent}
386 386 placement={'bottom'}
387   - visible={
  387 + open={
388 388 ((props?.params?.range || !userId) && !userList) || props.readOnly ? false : popVisible
389 389 }
390 390 trigger={'click'}
391 391 overlayClassName={'qx-user-selector--input__pop'}
392   - onVisibleChange={(v: boolean) => setPopVisible(v)}
  392 + onOpenChange={(v: boolean) => setPopVisible(v)}
393 393 >
394 394 <div
395 395 className={
... ...
  1 +@import '~@qx/ui/src/style/variable.less';
  2 +
1 3 .qx-user-input__box {
2 4 padding-left: 0;
3 5 background-color: transparent;
... ... @@ -100,7 +102,7 @@
100 102 color: #999;
101 103 font-weight: normal;
102 104 font-size: 14px;
103   - border-bottom: 1px solid #efefef;
  105 + border-bottom: 1px solid @N4;
104 106 &:first-child {
105 107 margin-top: 0;
106 108 }
... ... @@ -114,41 +116,41 @@
114 116 cursor: pointer;
115 117 &.qx-user-selector-more {
116 118 margin-top: 5px;
117   - color: #4ba9ff;
  119 + color: @B8;
118 120 &:hover {
119   - color: #4ba9ff;
  121 + color: @B7;
120 122 }
121 123 }
122 124 &.disabled {
123   - color: #ccc;
  125 + color: @N5;
124 126 cursor: default;
125 127 &:hover {
126   - color: #ccc;
  128 + color: @N5;
127 129 }
128 130 .qx-user-selector-code {
129   - color: #ccc;
  131 + color: @N5;
130 132 }
131 133 }
132 134
133 135 &:hover {
134   - color: #000;
135   - background-color: #fafafa;
  136 + color: @N9;
  137 + background-color: @N2;
136 138 }
137 139 &.qx-user-selector-pop-empty {
138 140 padding: 10px;
139   - color: #aaa;
  141 + color: @N5;
140 142 text-align: center;
141   - background-color: #fbfbfb;
  143 + background-color: @N2;
142 144 cursor: default;
143 145 &:hover {
144   - color: #aaa;
  146 + color: @N5;
145 147 }
146 148 }
147 149 }
148 150 }
149 151
150 152 .qx-user-selector-code {
151   - color: rgb(102, 102, 102);
  153 + color: @N7;
152 154 }
153 155 .qx-user-selector__dialog {
154 156 .ant-modal-body {
... ... @@ -183,7 +185,7 @@
183 185 height: 60px;
184 186 padding: 5px;
185 187 overflow: auto;
186   - border-bottom: 1px solid #f0f0f0;
  188 + border-bottom: 1px solid @N4;
187 189
188 190 .ant-tag {
189 191 margin: 1px 2px;
... ... @@ -198,7 +200,7 @@
198 200 .qx-user-selector__left {
199 201 height: @contentHeight;
200 202 overflow: hidden;
201   - border-right: 1px solid #f0f0f0;
  203 + border-right: 1px solid @N4;
202 204
203 205 .qx-user-selector__collapse {
204 206 border: none;
... ... @@ -211,11 +213,11 @@
211 213 }
212 214
213 215 .ant-collapse-content {
214   - border-color: #f0f0f0;
  216 + border-color: @N4;
215 217 }
216 218
217 219 .ant-collapse > .ant-collapse-item {
218   - border-color: #f0f0f0;
  220 + border-color: @N4;
219 221 }
220 222 }
221 223
... ... @@ -223,7 +225,7 @@
223 225 display: flex;
224 226 flex-direction: column;
225 227 height: @contentHeight;
226   - border-left: 1px solid #f0f0f0;
  228 + border-left: 1px solid @N4;
227 229 border-left: none;
228 230
229 231 &__header {
... ... @@ -232,7 +234,7 @@
232 234 justify-content: space-between;
233 235 height: 40px;
234 236 padding: 0 10px;
235   - border-bottom: 1px solid #f0f0f0;
  237 + border-bottom: 1px solid @N4;
236 238
237 239 .ant-checkbox-wrapper {
238 240 white-space: nowrap;
... ... @@ -260,13 +262,13 @@
260 262 .ant-table-pagination.ant-pagination {
261 263 margin: 0;
262 264 padding: 11px;
263   - border-top: 1px solid #f0f0f0;
  265 + border-top: 1px solid @N4;
264 266 }
265 267 }
266 268
267 269 .qx-user-selector__user-search {
268 270 padding: 7px 10px;
269   - border-bottom: 1px solid #f0f0f0;
  271 + border-bottom: 1px solid @N4;
270 272 }
271 273
272 274 .qx-selector-tab {
... ... @@ -339,7 +341,7 @@
339 341 cursor: pointer;
340 342
341 343 &:hover {
342   - background-color: #fafafa;
  344 + background-color: @N2;
343 345 }
344 346
345 347 .ant-checkbox-wrapper,
... ...