@cloudbase/weda-ui 3.4.4 → 3.4.6

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 (147) hide show
  1. package/dist/configs/components/chart/bar.json +113 -8
  2. package/dist/configs/components/chart/line.js +113 -8
  3. package/dist/configs/components/chart/pie.json +113 -8
  4. package/dist/configs/components/chart/statisticsCard.json +57 -0
  5. package/dist/configs/components/dataView.js +7 -7
  6. package/dist/configs/components/form/input.json +48 -2
  7. package/dist/configs/components/form/richText.json +2 -1
  8. package/dist/configs/components/form/uploader.json +62 -14
  9. package/dist/configs/components/graphicCard.json +1 -1
  10. package/dist/configs/components/grid/col.js +4 -1
  11. package/dist/configs/components/grid/grid.js +8 -3
  12. package/dist/configs/components/grid/row.js +51 -3
  13. package/dist/configs/components/listView.js +113 -9
  14. package/dist/configs/components/navLayout.json +1 -1
  15. package/dist/configs/components/repeater.js +4 -1
  16. package/dist/configs/components/table.json +125 -9
  17. package/dist/configs/components/wd-bubble.js +6 -0
  18. package/dist/configs/components/wd-button.js +6 -0
  19. package/dist/configs/components/wd-divider.js +7 -18
  20. package/dist/configs/components/wd-icon.js +7 -0
  21. package/dist/configs/components/wd-image.js +7 -0
  22. package/dist/configs/components/wd-link.js +7 -2
  23. package/dist/configs/components/wd-text.js +14 -6
  24. package/dist/configs/index.js +0 -2
  25. package/dist/docs/common/componentList.js +1 -1
  26. package/dist/style/index.scss +1 -1
  27. package/dist/web/actions/showModal/index.js +1 -1
  28. package/dist/web/components/calendar/index.js +2 -2
  29. package/dist/web/components/chart/common/data-transform.js +1 -1
  30. package/dist/web/components/chart/statisticsCard/index.js +1 -1
  31. package/dist/web/components/flow/components/index.js +0 -4
  32. package/dist/web/components/flow/frame/index.js +4 -3
  33. package/dist/web/components/flow/frame/types.js +11 -5
  34. package/dist/web/components/flow/frame/utils.js +60 -1
  35. package/dist/web/components/flow/modules/chart/Chart.js +2 -3
  36. package/dist/web/components/flow/modules/chart/index.css +0 -3
  37. package/dist/web/components/flow/modules/combination/index.js +1 -1
  38. package/dist/web/components/flow/modules/operations/components/button/index.js +11 -0
  39. package/dist/web/components/flow/modules/operations/components/button/style.css +5 -0
  40. package/dist/web/components/flow/modules/operations/components/index.js +6 -0
  41. package/dist/web/components/flow/modules/operations/components/popup/index.js +100 -0
  42. package/dist/web/components/flow/modules/operations/components/popup/style.css +154 -0
  43. package/dist/web/components/flow/modules/operations/components/popup/types.js +1 -0
  44. package/dist/web/components/flow/modules/operations/components/user-select/index.js +43 -0
  45. package/dist/web/components/flow/modules/operations/components/user-select/style.css +4 -0
  46. package/dist/web/components/flow/modules/operations/components/user-select/types.js +1 -0
  47. package/dist/web/components/flow/modules/operations/config/approval-form-config.js +140 -0
  48. package/dist/web/components/flow/modules/operations/config/control-config.js +218 -0
  49. package/dist/web/components/flow/modules/operations/config/index.js +2 -0
  50. package/dist/web/components/flow/modules/operations/config/types.js +1 -0
  51. package/dist/web/components/flow/modules/operations/control.js +26 -0
  52. package/dist/web/components/flow/modules/operations/controls-items/add-assignee-btn.js +33 -0
  53. package/dist/web/components/flow/modules/operations/controls-items/apply-cc-btn.js +12 -0
  54. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/comment/index.js +188 -0
  55. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/comment/style.css +51 -0
  56. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/drawer-form/index.js +64 -0
  57. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/drawer-form/types.js +1 -0
  58. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/drawer-form/view-model.js +83 -0
  59. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/field/index.js +16 -0
  60. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/field/style.css +56 -0
  61. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/index.js +47 -0
  62. package/dist/web/components/flow/modules/operations/controls-items/approval-drawer/style.css +60 -0
  63. package/dist/web/components/flow/modules/operations/controls-items/cancel-apply-btn.js +15 -0
  64. package/dist/web/components/flow/modules/operations/controls-items/check-list-popup/index.js +11 -0
  65. package/dist/web/components/flow/modules/operations/controls-items/check-list-popup/style.css +26 -0
  66. package/dist/web/components/flow/modules/operations/controls-items/flow-task-info-modal.js +98 -0
  67. package/dist/web/components/flow/modules/operations/controls-items/index.js +18 -0
  68. package/dist/web/components/flow/modules/operations/controls-items/initiation-btn.js +25 -0
  69. package/dist/web/components/flow/modules/operations/controls-items/revoke-modal/index.js +50 -0
  70. package/dist/web/components/flow/modules/operations/controls-items/revoke-modal/style.css +28 -0
  71. package/dist/web/components/flow/modules/operations/controls-items/roll-back-modal.js +104 -0
  72. package/dist/web/components/flow/modules/operations/controls-items/types.js +1 -0
  73. package/dist/web/components/flow/modules/operations/index.js +2 -0
  74. package/dist/web/components/flow/modules/operations/style.css +20 -0
  75. package/dist/web/components/flow/modules/operations/view-model.js +137 -0
  76. package/dist/web/components/flow/services/ideData/instance.js +2 -2
  77. package/dist/web/components/flow/services/ideData/pageDetail.js +1 -0
  78. package/dist/web/components/form/select/dropdown-select/h5.js +1 -1
  79. package/dist/web/components/form/select/dropdown-select/index.css +7 -0
  80. package/dist/web/components/form/select/index.js +2 -7
  81. package/dist/web/components/form/textarea/index.js +1 -1
  82. package/dist/web/components/form/uploader/index.css +19 -0
  83. package/dist/web/components/form/uploader/index.js +21 -3
  84. package/dist/web/components/form/uploader/uploader.h5.js +14 -8
  85. package/dist/web/components/form/uploader/uploader.pc.js +29 -16
  86. package/dist/web/components/form/uploaderFile/index.css +9 -5
  87. package/dist/web/components/form/uploaderFile/uploadFile.h5.js +23 -21
  88. package/dist/web/components/form/uploaderFile/uploadFile.pc.js +14 -10
  89. package/dist/web/components/form/userOrgSelect/common/fetch-data-service.js +0 -1
  90. package/dist/web/components/form/userOrgSelect/component/depart-select/index.js +1 -1
  91. package/dist/web/components/form/userOrgSelect/component/user-select-h5/index.js +43 -22
  92. package/dist/web/components/form/userOrgSelect/component/user-select-h5/user-select-h5.js +15 -4
  93. package/dist/web/components/form/userOrgSelect/component/user-select-pc/user-model.js +2 -2
  94. package/dist/web/components/form/userOrgSelect/component/user-select-pc/user-select-pc.js +4 -2
  95. package/dist/web/components/grid/col.js +81 -18
  96. package/dist/web/components/grid/grid.js +1 -1
  97. package/dist/web/components/grid/row.js +4 -2
  98. package/dist/web/components/index.js +1 -1
  99. package/dist/web/components/listView/index.js +98 -100
  100. package/dist/web/components/lottery/index.js +122 -123
  101. package/dist/web/components/richTextView/index.css +2 -0
  102. package/dist/web/components/swiper/index.js +14 -8
  103. package/dist/web/components/table/BaseTable.js +3 -3
  104. package/dist/web/components/table/ExportFileModalByApi/index.js +1 -1
  105. package/dist/web/components/table/ImportFileModal/index.js +1 -1
  106. package/dist/web/components/table/ImportFileModalByApi/index.js +1 -1
  107. package/dist/web/components/wd-bubble/wd-bubble.js +11 -3
  108. package/dist/web/components/wd-button/wd-button.js +22 -13
  109. package/dist/web/components/wd-divider/wd-divider.js +10 -7
  110. package/dist/web/components/wd-icon/wd-icon.js +12 -3
  111. package/dist/web/components/wd-image/index.js +12 -5
  112. package/dist/web/components/wd-link/wd-link.js +11 -3
  113. package/dist/web/components/wd-text/wd-text.js +15 -3
  114. package/dist/web/utils/hooks/use-cloud-id-temp-url.js +7 -2
  115. package/dist/web/utils/platform.js +9 -2
  116. package/dist/web/utils/tool.js +11 -0
  117. package/dist/web/utils/widget-api/index.js +3 -0
  118. package/package.json +7 -5
  119. package/dist/configs/components/auth.json +0 -17
  120. package/dist/web/components/flow/components/FlowUserSelect/index.css +0 -116
  121. package/dist/web/components/flow/components/FlowUserSelect/index.js +0 -115
  122. package/dist/web/components/flow/components/HighlightTextarea/index.css +0 -42
  123. package/dist/web/components/flow/components/HighlightTextarea/index.js +0 -131
  124. package/dist/web/components/flow/components/UserSelectModel/UserSelect.js +0 -74
  125. package/dist/web/components/flow/components/UserSelectModel/UserSelectMobile.css +0 -8
  126. package/dist/web/components/flow/components/UserSelectModel/UserSelectMobile.js +0 -86
  127. package/dist/web/components/flow/components/UserSelectModel/index.js +0 -18
  128. package/dist/web/components/flow/components/WedaUserTransfer/index.css +0 -3
  129. package/dist/web/components/flow/components/WedaUserTransfer/index.js +0 -162
  130. package/dist/web/components/flow/modules/control/ApprovalDrawer.css +0 -144
  131. package/dist/web/components/flow/modules/control/ApprovalDrawer.js +0 -178
  132. package/dist/web/components/flow/modules/control/ApprovalPopup.css +0 -115
  133. package/dist/web/components/flow/modules/control/ApprovalPopup.js +0 -241
  134. package/dist/web/components/flow/modules/control/Control.css +0 -29
  135. package/dist/web/components/flow/modules/control/Control.js +0 -93
  136. package/dist/web/components/flow/modules/control/ControlMobile.css +0 -69
  137. package/dist/web/components/flow/modules/control/ControlMobile.js +0 -133
  138. package/dist/web/components/flow/modules/control/FlowTaskInfoModal.css +0 -3
  139. package/dist/web/components/flow/modules/control/FlowTaskInfoModal.js +0 -31
  140. package/dist/web/components/flow/modules/control/constants/index.js +0 -35
  141. package/dist/web/components/flow/modules/control/index.js +0 -15
  142. package/dist/web/components/flow/modules/control/provider/index.js +0 -17
  143. package/dist/web/components/flow/modules/control/provider/useControlModel.js +0 -256
  144. package/dist/web/components/flow/modules/control/provider/useMobileModel.js +0 -86
  145. package/dist/web/components/flow/modules/control/provider/useRevokeAndBackHook.js +0 -82
  146. package/dist/web/components/flow/modules/control/utils/ControlModelUtils.js +0 -57
  147. package/dist/web/components/flow/modules/control/utils/index.js +0 -2
@@ -1,10 +1,10 @@
1
- import * as React from 'react';
1
+ import React, { forwardRef, useImperativeHandle } from 'react';
2
2
  import classNames from '../../utils/classnames';
3
3
  import { emptyObject } from '../../utils/constant';
4
4
  import { useConfig } from '../../utils/config-context';
5
5
  import { usePlatform } from '../../utils/platform';
6
6
  import { WdIcon } from '../index';
7
- export const WdLink = ({ content, url, isOpenInNewWindow, params, iconType, iconSource = 'inner', icon, iconSrc, iconPosition = 'before', disabled, enableSlot = true, contentSlot, events = emptyObject, className, style, id, ...props }) => {
7
+ export const WdLink = forwardRef(function WdLink({ content, url, isOpenInNewWindow, params, iconType, iconSource = 'inner', icon, iconSrc, iconPosition = 'before', disabled, enableSlot = true, contentSlot, events = emptyObject, className, style, id, ...props }, ref) {
8
8
  const platform = usePlatform();
9
9
  // 样式
10
10
  const { classPrefix } = useConfig();
@@ -47,13 +47,21 @@ export const WdLink = ({ content, url, isOpenInNewWindow, params, iconType, icon
47
47
  });
48
48
  return icon || iconSrc ? (React.createElement(WdIcon, { className: iconCls, size: 'sm', name: icon, src: iconSrc, type: iconSource })) : null;
49
49
  };
50
+ // Widget API,挂载组件只读属性和组件方法
51
+ useImperativeHandle(ref, () => {
52
+ return {
53
+ content,
54
+ url,
55
+ disabled,
56
+ };
57
+ }, [content, url, disabled]);
50
58
  return (React.createElement("a", { style: style, className: classNames(classes, className), target: isOpenInNewWindow ? '_blank' : '_self', href: href, id: id, onClick: onClick, rel: "noopener noreferrer", ...props },
51
59
  enableSlot && contentSlot && (React.createElement("div", { className: `${classPrefix}-link__slot` }, contentSlot)),
52
60
  React.createElement("span", { className: `${classPrefix}-link__wrap` },
53
61
  iconPosition === 'before' && iconType === 'text-with-icon' && React.createElement(Icon, null),
54
62
  iconType === 'icon-only' ? (React.createElement(Icon, null)) : (React.createElement("span", { className: `${classPrefix}-link__text` }, content)),
55
63
  iconPosition === 'after' && iconType === 'text-with-icon' && React.createElement(Icon, null))));
56
- };
64
+ });
57
65
  function processUrl(url, params) {
58
66
  url = url === null || url === void 0 ? void 0 : url.trim();
59
67
  // URL 构造函数不支持 '//xxx.com' 的格式
@@ -1,11 +1,11 @@
1
- import * as React from 'react';
1
+ import React, { forwardRef, useImperativeHandle } from 'react';
2
2
  import classNames from '../../utils/classnames';
3
3
  import { useConfig } from '../../utils/config-context';
4
4
  import { textToString, usePlatform } from '../../utils/platform';
5
5
  import { convertLegacyProps } from './convert-legacy-props';
6
6
  import { convertLegacyEnum } from '../../utils/tool';
7
7
  import { WD_TEXT_LEVEL, WD_TEXT_MAX_LINES } from '../../../enum';
8
- export const WdText = ({ className, style, id, level: _level = 'body-default', text, overflow, maxLines: _maxLines, space, tips, userSelect, events, contenteditable, onInput, onBlur, ...props }) => {
8
+ export const WdText = forwardRef(function WdText({ className, style, id, level: _level = 'body-default', text, overflow, maxLines: _maxLines, space, tips, userSelect, events, contenteditable, onInput, onBlur, ...props }, ref) {
9
9
  const platform = usePlatform();
10
10
  // 兼容旧版组件的属性值
11
11
  let level = convertLegacyProps('level', String(_level)) || _level;
@@ -58,6 +58,18 @@ export const WdText = ({ className, style, id, level: _level = 'body-default', t
58
58
  return acc;
59
59
  }, {});
60
60
  }, [props]);
61
+ // Widget API,挂载组件只读属性和组件方法
62
+ useImperativeHandle(ref, () => {
63
+ return {
64
+ text,
65
+ level,
66
+ overflow,
67
+ maxLines,
68
+ space,
69
+ userSelect,
70
+ tips,
71
+ };
72
+ }, [text, level, overflow, maxLines, space, userSelect, tips]);
61
73
  switch (level) {
62
74
  case 'title-1':
63
75
  return (React.createElement("h1", { className: classNames(classes, className), style: inlineStyle, id: id,
@@ -88,4 +100,4 @@ export const WdText = ({ className, style, id, level: _level = 'body-default', t
88
100
  //@ts-expect-error contentEditable type def sucks
89
101
  contentEditable: contenteditable, onInput: onInput, onBlur: onBlur, title: tips ? textToString(text) : '', onClick: (e) => events.tap({}, { originEvent: e }), ...propsStartWithOn }, textToString(text)));
90
102
  }
91
- };
103
+ });
@@ -1,10 +1,15 @@
1
1
  import useSWR from 'swr';
2
2
  import { getTempFileURL } from '../tcb';
3
+ import { isCloudFileID, transFileCloudidToName } from '../platform';
3
4
  export function useTempUrl(cloudId) {
5
+ const isCloudId = isCloudFileID(cloudId);
4
6
  const prefix = 'tcb:cloud-id:temp-url';
5
- const key = `${prefix}:${cloudId}`;
7
+ // https格式不走cloudId处理逻辑
8
+ const key = isCloudId
9
+ ? `${prefix}:${transFileCloudidToName(cloudId)}`
10
+ : cloudId;
6
11
  return useSWR(key, async () => {
7
- if (!(cloudId === null || cloudId === void 0 ? void 0 : cloudId.startsWith('cloud://'))) {
12
+ if (!isCloudId) {
8
13
  return cloudId;
9
14
  }
10
15
  const tempUrl = await getTempFileURL(cloudId);
@@ -152,7 +152,7 @@ export const isWXIDE = () => /wechatideplugin/i.test(navigator.userAgent);
152
152
  export const resolveStaticResourceUrl = (path) => {
153
153
  var _a, _b;
154
154
  try {
155
- // eslint-disable-next-line no-unsafe-optional-chaining
155
+ // eslint-disable-next-line no-unsafe-optional-chaining, prettier/prettier
156
156
  const resourceUrl = (_b = (_a = window === null || window === void 0 ? void 0 : window.app) === null || _a === void 0 ? void 0 : _a.__internal__) === null || _b === void 0 ? void 0 : _b.resolveStaticResourceUrl(path);
157
157
  return resourceUrl;
158
158
  }
@@ -222,7 +222,6 @@ export const getWhereList = (where) => {
222
222
  if (val === '' ||
223
223
  val === undefined ||
224
224
  Object.prototype.toString.call(val) === '[object Object]') {
225
- console.error(`${item2 === null || item2 === void 0 ? void 0 : item2.key}筛选值为:${val},不符合查询条件,请检查绑定变量值是否正确`);
226
225
  return;
227
226
  }
228
227
  if ('_begin_with' === rel) {
@@ -349,3 +348,11 @@ export const getUserInfo = () => {
349
348
  export const isSupportLoading = () => {
350
349
  return 'loading' in HTMLImageElement.prototype;
351
350
  };
351
+ /**
352
+ * 判断web是否被小程序嵌套
353
+ */
354
+ export const isWebInMiniprogram = () => {
355
+ var ua = navigator.userAgent.toLowerCase();
356
+ return ((ua.match(/micromessenger/i) && ua.match(/miniprogram/i)) ||
357
+ window['__wxjs_environment'] === 'miniprogram');
358
+ };
@@ -107,3 +107,14 @@ export const getFieldsTypeName = (fields) => {
107
107
  return item;
108
108
  });
109
109
  };
110
+ /**
111
+ * 从 props 中取出 on 开头的
112
+ */
113
+ export const filterPropsWithOn = (props) => {
114
+ return Object.keys(props).reduce((acc, cur) => {
115
+ if (cur.startsWith('on')) {
116
+ acc[cur] = props[cur];
117
+ }
118
+ return acc;
119
+ }, {});
120
+ };
@@ -7,6 +7,9 @@ export function getParentForm($node) {
7
7
  if (cur.parent) {
8
8
  cur = cur.parent;
9
9
  }
10
+ else {
11
+ cur = cur.getOwnerWidget();
12
+ }
10
13
  }
11
14
  return cur;
12
15
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudbase/weda-ui",
3
- "version": "3.4.4",
3
+ "version": "3.4.6",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index",
6
6
  "miniprogram": "mpdist",
@@ -61,7 +61,7 @@
61
61
  "license": "MIT",
62
62
  "description": "腾讯云微搭低代码组件库模板",
63
63
  "dependencies": {
64
- "@antv/g6": "3.8.5",
64
+ "@antv/g6": "^4.8.5",
65
65
  "@loadable/component": "^5.15.2",
66
66
  "@react-hookz/web": "^14.2.2",
67
67
  "@sinclair/typebox": "^0.25.3",
@@ -83,9 +83,9 @@
83
83
  "react-error-boundary": "^3.1.4",
84
84
  "react-highlight-within-textarea": "3.1.1",
85
85
  "react-infinite-scroll-component": "6.1.0",
86
- "react-vant": "3.0.0-rc.7",
86
+ "react-transition-group": "^4.4.5",
87
87
  "spark-md5": "^3.0.2",
88
- "swr": "^1.3.0",
88
+ "swr": "^2.0.3",
89
89
  "tdesign-icons-react": "0.0.8",
90
90
  "tea-component": "^2.7.8",
91
91
  "uuid": "8.3.2",
@@ -103,6 +103,8 @@
103
103
  "@babel/preset-typescript": "^7.18.6",
104
104
  "@cloudbase/cals": "^0.5.1-beta.8",
105
105
  "@cloudbase/lowcode-cli": "^0.18.3",
106
+ "@cloudbase/weda-client": "^0.2.45",
107
+ "@cloudbase/weda-cloud-sdk": "^1.0.26",
106
108
  "@commitlint/cli": "^16.0.2",
107
109
  "@commitlint/config-conventional": "^17.0.0",
108
110
  "@craco/craco": "^7.0.0-alpha.7",
@@ -167,7 +169,7 @@
167
169
  "jest-preview": "^0.2.6",
168
170
  "json-schema-to-ts": "^2.5.5",
169
171
  "make-fetch-happen": "^11.0.1",
170
- "miniprogram-simulate": "^1.5.7",
172
+ "miniprogram-simulate": "^1.5.8",
171
173
  "mkdirp": "^1.0.4",
172
174
  "mochawesome": "^7.1.3",
173
175
  "mochawesome-merge": "^4.2.1",
@@ -1,17 +0,0 @@
1
- {
2
- "$schema": "https://comp-public-1303824488.cos.ap-shanghai.myqcloud.com/schema/lcds_component.json",
3
- "data": {
4
- "properties": {}
5
- },
6
- "events": [],
7
- "meta": {
8
- "name": "Auth",
9
- "title": "登录",
10
- "description": "登录组件",
11
- "icon": "./auth.svg",
12
- "category": "开放能力",
13
- "categoryOrder": 1,
14
- "componentOrder": 1,
15
- "visible": []
16
- }
17
- }
@@ -1,116 +0,0 @@
1
- .flow-user-select-mobile {
2
- height: calc(100% - 52px);
3
- }
4
- .flow-user-select-mobile .page-info__wrapper-mobile {
5
- position: relative;
6
- height: 100%;
7
- background: #f2f2f2;
8
- }
9
- .flow-user-select-mobile .page-info__wrapper-mobile .wedatea2td-table {
10
- height: calc(100% - 200px) !important;
11
- }
12
- .flow-user-select-mobile
13
- .page-info__wrapper-mobile
14
- .wedatea2td-table
15
- .wedatea2td-table__body {
16
- max-height: calc(100% - 50px) !important;
17
- }
18
- .flow-user-select-mobile .page-info__wrapper-mobile footer.selected-info {
19
- position: absolute;
20
- bottom: 0;
21
- left: 0;
22
- right: 0;
23
- height: 90px;
24
- padding: 12px 16px 0 20px;
25
- box-sizing: border-box;
26
- background: #fff;
27
- }
28
- .flow-user-select-mobile
29
- .page-info__wrapper-mobile
30
- footer.selected-info
31
- .selected-info__left
32
- .selected-count {
33
- font-size: 14px;
34
- color: #2473f2;
35
- }
36
- .flow-user-select-mobile
37
- .page-info__wrapper-mobile
38
- footer.selected-info
39
- .selected-info__left
40
- .selected-people {
41
- font-size: 12px;
42
- color: #c2c2c2;
43
- max-width: 200px;
44
- text-overflow: ellipsis;
45
- overflow: hidden;
46
- white-space: nowrap;
47
- }
48
- .flow-user-select-mobile
49
- .page-info__wrapper-mobile
50
- footer.selected-info
51
- .selected-info__left
52
- .collapse-spread {
53
- display: inline-block;
54
- margin-left: 16px;
55
- width: 8px;
56
- height: 8px;
57
- border: none;
58
- border-top: 2px solid #2473f2;
59
- border-right: 2px solid #2473f2;
60
- transform: rotate(-45deg);
61
- vertical-align: middle;
62
- }
63
- .flow-user-select-mobile
64
- .page-info__wrapper-mobile
65
- footer.selected-info
66
- .submit-btn {
67
- width: 94px;
68
- height: 40px;
69
- border-radius: 4px;
70
- background: #2473f2;
71
- }
72
- .flow-user-select-mobile .page-info__wrapper-mobile .loading-dom__wrapper {
73
- height: calc(100% - 150px);
74
- display: flex;
75
- justify-content: space-around;
76
- align-items: center;
77
- background: #fff;
78
- }
79
- .SelectPersonOrg-popup .selected-title {
80
- position: sticky;
81
- top: 0;
82
- padding: 0 20px;
83
- height: 40px;
84
- line-height: 40px;
85
- display: flex;
86
- justify-content: space-between;
87
- border-bottom: 1px solid #dcdee6;
88
- }
89
- .SelectPersonOrg-popup .selected-title .tea-btn {
90
- font-size: 16px;
91
- }
92
- .SelectPersonOrg-popup .selected-title .tea-btn--text {
93
- color: #666;
94
- }
95
- .SelectPersonOrg-popup .selected-title .tea-btn--link {
96
- color: #006eff;
97
- }
98
- .SelectPersonOrg-popup .selected-title span {
99
- font-size: 14px;
100
- }
101
- .SelectPersonOrg-popup .selected-person {
102
- height: calc(100% - 41px);
103
- padding: 0 20px;
104
- overflow-y: auto;
105
- }
106
- .SelectPersonOrg-popup .selected-person .tea-justify-grid {
107
- height: 40px;
108
- line-height: 40px;
109
- border-bottom: 1px solid #dcdee6;
110
- }
111
- .SelectPersonOrg-popup
112
- .selected-person
113
- .tea-justify-grid
114
- .selected-person__name {
115
- font-size: 14px;
116
- }
@@ -1,115 +0,0 @@
1
- /* eslint-disable no-param-reassign */
2
- import React, { useState, useEffect, useMemo } from 'react';
3
- import { Justify, Button, Icon } from 'tea-component';
4
- import { Popup } from 'react-vant';
5
- import { safeJsonParse } from '../../../../utils/tool';
6
- import { WedaUserTransfer } from '../WedaUserTransfer';
7
- import './index.css';
8
- export const FlowUserSelect = (props) => {
9
- const { visible, approveField, mode, close } = props;
10
- const [selected, setSelected] = useState([]);
11
- const [selectedUser, setSelectedUser] = useState([]);
12
- const [collapse, setCollapseStatus] = useState(true);
13
- useEffect(() => {
14
- document.title = '选择人员';
15
- const selectedAvatar = sessionStorage.getItem('selected');
16
- selectedAvatar && setSelected(safeJsonParse(selectedAvatar || '[]'));
17
- }, []);
18
- const selectedLen = useMemo(() => selected.length, [selected]);
19
- const removeId = (id) => {
20
- setSelected(selected.filter((item) => item !== id));
21
- setSelectedUser(selectedUser.filter((item) => (item === null || item === void 0 ? void 0 : item.UserId) !== id));
22
- };
23
- const handleHighLightSelected = (selected, flowData) => {
24
- let v = '';
25
- const { opinionUserMap, approveInfo } = flowData;
26
- selected.forEach((id) => {
27
- const user = selectedUser.find((user) => (user === null || user === void 0 ? void 0 : user.UserId) === id) || {};
28
- const name = `@${user === null || user === void 0 ? void 0 : user.Name}`;
29
- v = `${v + name} `;
30
- if (!opinionUserMap[id]) {
31
- opinionUserMap[id] = name;
32
- }
33
- });
34
- flowData.approveInfo = approveInfo + v;
35
- flowData.opinionUserMap = { ...opinionUserMap };
36
- };
37
- const saveSelect = () => {
38
- var _a;
39
- const flowData = (_a = safeJsonParse(sessionStorage.getItem('FlowActionsMobile'))) !== null && _a !== void 0 ? _a : {};
40
- if (approveField === 'assigneeIds') {
41
- flowData.assigneeIds = selected;
42
- sessionStorage.setItem('hasSignSubmit', 'hasSignSubmit');
43
- }
44
- else if (approveField === 'highLightApprovers') {
45
- handleHighLightSelected(selected, flowData);
46
- }
47
- else {
48
- flowData[approveField] = selected;
49
- }
50
- sessionStorage.setItem('FlowActionsMobile', JSON.stringify(flowData));
51
- sessionStorage.setItem(approveField, JSON.stringify(selectedUser));
52
- // history.go(-1);
53
- close === null || close === void 0 ? void 0 : close();
54
- };
55
- const onWedaUserSelectChange = ({ keys, rows }) => {
56
- setSelected(keys);
57
- setSelectedUser(rows);
58
- };
59
- useEffect(() => {
60
- let lastTouchEnd = 0;
61
- const touchstartFn = (event) => {
62
- if (event.touches.length > 1) {
63
- event.preventDefault();
64
- }
65
- };
66
- const touchendFn = (event) => {
67
- const now = new Date().getTime();
68
- if (now - lastTouchEnd <= 300) {
69
- event.preventDefault();
70
- }
71
- lastTouchEnd = now;
72
- };
73
- const gesturestartFn = (event) => {
74
- event.preventDefault();
75
- };
76
- document.addEventListener('touchstart', touchstartFn);
77
- document.addEventListener('touchend', touchendFn, false);
78
- // 阻止双指放大
79
- document.addEventListener('gesturestart', gesturestartFn);
80
- return () => {
81
- document.removeEventListener('touchstart', touchstartFn);
82
- document.removeEventListener('touchend', touchendFn);
83
- document.removeEventListener('gesturestart', gesturestartFn);
84
- };
85
- }, []);
86
- return (React.createElement(Popup, { visible: visible, position: "bottom", className: "flow-user-select-mobile" },
87
- React.createElement("section", { className: "page-info__wrapper-mobile" },
88
- React.createElement(WedaUserTransfer, { multiple: mode === 'multiple', isMobile: true, onSelectedChange: onWedaUserSelectChange, value: selected, className: "flow-user-select-mobile-table" }),
89
- React.createElement("footer", { className: "selected-info" },
90
- React.createElement(Justify, { left: React.createElement("div", { className: "selected-info__left" },
91
- React.createElement("p", { className: "selected-count", onClick: () => setCollapseStatus(false) },
92
- React.createElement("span", { style: { display: 'inline-block' } },
93
- "\u5DF2\u9009\uFF1A",
94
- selectedLen,
95
- "\u4EBA"),
96
- React.createElement("span", { className: "collapse-spread" })),
97
- React.createElement("p", { className: "selected-people" }, selectedUser.map((item) => item === null || item === void 0 ? void 0 : item.Name).join(','))), right: React.createElement(React.Fragment, null,
98
- React.createElement(Button, { className: "submit-btn", type: "primary", onClick: saveSelect },
99
- "\u786E\u8BA4(",
100
- selectedLen,
101
- ")"),
102
- React.createElement(Button, { type: "link", onClick: () => {
103
- close === null || close === void 0 ? void 0 : close();
104
- } }, "\u5173\u95ED")) })),
105
- React.createElement(Popup, { className: "SelectPersonOrg-popup", visible: !collapse, position: "bottom", style: { height: '440px' } },
106
- React.createElement(React.Fragment, null,
107
- React.createElement("p", { className: "selected-title" },
108
- React.createElement(Button, { type: "text", onClick: () => setCollapseStatus(true) }, "\u53D6\u6D88"),
109
- React.createElement("span", null,
110
- "\u5DF2\u9009\uFF1A",
111
- selectedLen,
112
- "\u4EBA"),
113
- React.createElement(Button, { type: "link", onClick: saveSelect }, "\u5B8C\u6210")),
114
- React.createElement("div", { className: "selected-person" }, selectedUser.map((item) => (React.createElement(Justify, { key: item === null || item === void 0 ? void 0 : item.UserId, left: React.createElement("span", { className: "selected-person__name" }, item === null || item === void 0 ? void 0 : item.Name), right: React.createElement(Icon, { onClick: () => removeId(item === null || item === void 0 ? void 0 : item.UserId), type: "dismiss" }) })))))))));
115
- };
@@ -1,42 +0,0 @@
1
- .highlight-textarea-content {
2
- display: inline-block;
3
- width: 100%;
4
- }
5
- .highlight-textarea {
6
- position: relative;
7
- height: 100px;
8
- border: 1px solid #dcdee6;
9
- text-align: left;
10
- overflow: scroll;
11
- display: inline-block;
12
- width: 99%;
13
- margin-bottom: -5px;
14
- }
15
- .highlight-textarea .public-DraftEditorPlaceholder-root {
16
- display: none;
17
- }
18
- .highlight-textarea .DraftEditor-root {
19
- position: absolute;
20
- width: 100%;
21
- z-index: 1;
22
- }
23
- .highlight-textarea .DraftEditor-root .DraftEditor-editorContainer {
24
- padding: 5px;
25
- height: 6em;
26
- }
27
- .highlight-textarea
28
- .DraftEditor-root
29
- .DraftEditor-editorContainer
30
- .public-DraftEditor-content {
31
- height: 100%;
32
- }
33
- .highlight-textarea .DraftEditor-root .DraftEditor-editorContainer mark {
34
- color: #888888;
35
- background: transparent;
36
- }
37
- .highlight-textarea .highlight-textarea-placeholder {
38
- position: absolute;
39
- z-index: 0;
40
- margin: 5px;
41
- color: #999999;
42
- }
@@ -1,131 +0,0 @@
1
- import React, { useState, useEffect, useRef } from 'react';
2
- import HighlightWithinTextarea from 'react-highlight-within-textarea';
3
- import { UserSelectModel } from '../UserSelectModel';
4
- import './index.css';
5
- export const HighlightTextarea = ({ size = 'pc', placeholder = '请输入', value, onChange, opinionUserMap, setOpinionUserMap, setHighlightPositionMap, }) => {
6
- const [selectPersonModalShow, setSelectPersonModalShow] = useState(false);
7
- const range = useRef();
8
- const [placeholderVisible, setPlaceholderVisible] = useState(!value);
9
- const [highlightPositions, setHighlightPositions] = useState([]);
10
- const [copyMsg, setCopyMsg] = useState('');
11
- useEffect(() => {
12
- if (!value) {
13
- setPlaceholderVisible(true);
14
- setOpinionUserMap({});
15
- return;
16
- }
17
- setPlaceholderVisible(false);
18
- const { res: highlightPositions, obj: highlightPositionObj } = checkHighLight(value);
19
- setHighlightPositions([...highlightPositions]);
20
- setHighlightPositionMap({ ...highlightPositionObj });
21
- const newOpinionUserMap = {};
22
- // value每次change后需要再次检查opinionUserMap
23
- for (const [id, name] of Object.entries(opinionUserMap)) {
24
- if (value.indexOf(name) !== -1) {
25
- newOpinionUserMap[id] = name;
26
- }
27
- }
28
- setOpinionUserMap(newOpinionUserMap);
29
- }, [value]);
30
- const checkHighLight = (text) => {
31
- const highlightList = Object.values(opinionUserMap);
32
- const len = highlightList.length;
33
- let v = text;
34
- let res = [];
35
- // 回显时使用,必须顺序排列
36
- let obj = {};
37
- for (let i = 0; i < len; i++) {
38
- const indexof = v.indexOf(highlightList[i]);
39
- const itemLen = highlightList[i].length;
40
- if (indexof !== -1) {
41
- const endIndex = indexof + itemLen;
42
- res.push([indexof, endIndex]);
43
- obj[indexof] = endIndex;
44
- const fillText = new Array(itemLen).fill(' ').join(''); // 空格填充
45
- v = v.substring(0, indexof) + fillText + v.substring(endIndex);
46
- }
47
- }
48
- if (res.length > 0 && v.includes('@')) {
49
- // 继续检查剩下文本,是否存在重复@
50
- const { res: arr, obj: objCopy } = checkHighLight(v);
51
- res = res.concat(arr);
52
- obj = { ...obj, ...objCopy };
53
- }
54
- return { res, obj };
55
- };
56
- const changeValue = (addValue) => {
57
- var _a;
58
- const r = range.current;
59
- (_a = r === null || r === void 0 ? void 0 : r.insertNode) === null || _a === void 0 ? void 0 : _a.call(r, document.createTextNode(addValue));
60
- onChange(`${value}${addValue}`);
61
- };
62
- const getRange = () => {
63
- // 弹起人员选择弹框
64
- setSelectPersonModalShow(true);
65
- // 获取光标选区位置
66
- const s = window.getSelection();
67
- const r = s.getRangeAt(0);
68
- range.current = r;
69
- };
70
- const countAtSignal = (value) => {
71
- let count1 = 0;
72
- let count2 = 0;
73
- for (const v of value) {
74
- if (v === '@') {
75
- count1 += 1;
76
- }
77
- }
78
- for (const v of copyMsg) {
79
- if (v === '@') {
80
- count2 += 1;
81
- }
82
- }
83
- return count1 === count2;
84
- };
85
- return (React.createElement("div", { className: "highlight-textarea-content" },
86
- React.createElement("div", { className: "highlight-textarea", onKeyUp: (e) => {
87
- if (size === 'pc' &&
88
- e.shiftKey &&
89
- (e.key === '@' || e.keyCode === 50)) {
90
- getRange();
91
- return;
92
- }
93
- if (size === 'pc' && e.keyCode === 50) {
94
- // 判断当下value值是否存在2
95
- if (!countAtSignal(value)) {
96
- getRange();
97
- }
98
- }
99
- // eslint-disable-next-line rulesdir/no-timer
100
- setTimeout(() => setCopyMsg(value), 300);
101
- }, onFocus: () => {
102
- setPlaceholderVisible(false);
103
- }, onBlur: () => {
104
- if (!value) {
105
- setPlaceholderVisible(true);
106
- }
107
- } },
108
- React.createElement(HighlightWithinTextarea, { value: value, onChange: (value) => {
109
- onChange(value);
110
- }, highlight: highlightPositions }),
111
- placeholderVisible && (React.createElement("div", { className: "highlight-textarea-placeholder" }, placeholder))),
112
- React.createElement(UserSelectModel, { visible: selectPersonModalShow, placeholder: "\u8BF7\u9009\u62E9\u901A\u77E5\u4EBA\u5458", onClose: () => {
113
- setSelectPersonModalShow(false);
114
- }, onChange: (val) => {
115
- let v = '';
116
- const newOpinionUserMap = { ...opinionUserMap };
117
- (val || []).forEach((item, index) => {
118
- const name = `@${item.text}`;
119
- v = `${v + item.text} `;
120
- if (index < val.length - 1) {
121
- v = `${v}@`;
122
- }
123
- if (!opinionUserMap[item.value]) {
124
- newOpinionUserMap[item.value] = name;
125
- }
126
- });
127
- setOpinionUserMap({ ...newOpinionUserMap });
128
- changeValue(v || ' ');
129
- setSelectPersonModalShow(false);
130
- }, value: [] })));
131
- };