@zjlab-fe/data-hub-ui 0.21.6 → 0.22.0

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 (226) hide show
  1. package/dist/types/components/tip-tap/extensions/index.d.ts +1 -1
  2. package/es/assets/cardImg.png.js +3 -0
  3. package/es/assets/closeBtn.png.js +3 -0
  4. package/es/assets/icon-tag-header.png.js +3 -0
  5. package/es/assets/source.png.js +3 -0
  6. package/es/components/FileUploader/FileUploadModal.js +24 -0
  7. package/es/components/FileUploader/FileUploader.js +20 -0
  8. package/es/components/FileUploader/FileUploaderImpl/FileUploader.js +34 -0
  9. package/es/components/FileUploader/FileUploaderImpl/FileUploaderContextProvider.js +46 -0
  10. package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiver.css.js +36 -0
  11. package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiver.js +57 -0
  12. package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiverContainer.js +24 -0
  13. package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiverDesc.js +9 -0
  14. package/es/components/FileUploader/FileUploaderImpl/FileUploaderList.js +46 -0
  15. package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItem.js +46 -0
  16. package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemFail.js +21 -0
  17. package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemPaused.js +20 -0
  18. package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemUploading.js +43 -0
  19. package/es/components/FileUploader/FileUploaderImpl/FileUploaderlListItemFinished.js +32 -0
  20. package/es/components/FileUploader/Locale/translations.js +52 -0
  21. package/es/components/FileUploader/Locale/useTranslate.js +16 -0
  22. package/es/components/FileUploader/UploadStoreProvider/UploadStoreProvider.js +31 -0
  23. package/es/components/FileUploader/UploadStoreProvider/uploadStoreReducer.js +62 -0
  24. package/es/components/FileUploader/UploadStoreProvider/useOnFileAllUploaded.js +31 -0
  25. package/es/components/FileUploader/UploadStoreProvider/useSaveUnfinishedUploads.js +42 -0
  26. package/es/components/FileUploader/UploadStoreProvider/useSetupMergingEvent.js +45 -0
  27. package/es/components/FileUploader/hooks/useCancelUpload.js +40 -0
  28. package/es/components/FileUploader/hooks/useCurrentFile.js +61 -0
  29. package/es/components/FileUploader/hooks/useCurrentFileOnUploading.js +52 -0
  30. package/es/components/FileUploader/hooks/useCurrentFileSetupAndBackUp.js +39 -0
  31. package/es/components/FileUploader/hooks/useFormatFiles.js +64 -0
  32. package/es/components/FileUploader/hooks/useFormatFilesFindDuplicates.js +75 -0
  33. package/es/components/FileUploader/hooks/useFormatFilesRemoveDuplicates.js +21 -0
  34. package/es/components/FileUploader/hooks/useHandleChunkCompletion.js +31 -0
  35. package/es/components/FileUploader/hooks/useOnMounted.js +24 -0
  36. package/es/components/FileUploader/hooks/useOnMountedResumeUnfinished.js +58 -0
  37. package/es/components/FileUploader/hooks/useRetryUpload.js +33 -0
  38. package/es/components/FileUploader/hooks/useUploadChunk.js +46 -0
  39. package/es/components/FileUploader/icons/CloseFilled.js +7 -0
  40. package/es/components/FileUploader/icons/UnkownFileIcon.js +7 -0
  41. package/es/components/FileUploader/icons/UploadIcon.js +7 -0
  42. package/es/components/FileUploader/index.css.js +532 -0
  43. package/es/components/FileUploader/index.js +23 -0
  44. package/es/components/FileUploader/types.js +13 -0
  45. package/es/components/FileUploader/utils/calcDisplaySize.js +20 -0
  46. package/es/components/FileUploader/utils/checkExpiryTime.js +15 -0
  47. package/es/components/FileUploader/utils/createFileToUpload.js +60 -0
  48. package/es/components/FileUploader/utils/fileDB/addFilesToIndexdb.js +14 -0
  49. package/es/components/FileUploader/utils/fileDB/deleteFileInStore.js +18 -0
  50. package/es/components/FileUploader/utils/fileDB/deleteObjectStore.js +25 -0
  51. package/es/components/FileUploader/utils/fileDB/index.js +77 -0
  52. package/es/components/FileUploader/utils/fileDB/openDBAndRetrieveData.js +90 -0
  53. package/es/components/FileUploader/utils/fileDB/retrieveExistingData.js +49 -0
  54. package/es/components/FileUploader/utils/modalConfig.css.js +20 -0
  55. package/es/components/FileUploader/utils/modalConfig.js +32 -0
  56. package/es/components/FileUploader/utils/retrieveAllFiles.js +70 -0
  57. package/es/components/FileUploader/utils/splitFileIntoChunk.js +15 -0
  58. package/es/components/SDK-modal/document-link.js +8 -0
  59. package/es/components/SDK-modal/index.js +25 -0
  60. package/es/components/SDK-modal/index.module.scss.js +49 -0
  61. package/es/components/SDK-modal/inner-modal.js +59 -0
  62. package/es/components/SDK-modal/locale/translations.js +17 -0
  63. package/es/components/apply-perm-modal/index.js +53 -0
  64. package/es/components/apply-perm-modal/index.module.scss.js +96 -0
  65. package/es/components/auth-tag/index.js +23 -0
  66. package/es/components/bench-card/index.js +20 -0
  67. package/es/components/bench-card/index.module.scss.js +48 -0
  68. package/es/components/confirm-again/index.js +15 -0
  69. package/es/components/confirm-again/index.scss.js +37 -0
  70. package/es/components/copy/index.js +41 -0
  71. package/es/components/copy/index.module.scss.js +15 -0
  72. package/es/components/corpus-card/index.js +88 -0
  73. package/es/components/corpus-card/index.module.scss.js +171 -0
  74. package/es/components/feature-card/classNames.js +72 -0
  75. package/es/components/feature-card/components.js +48 -0
  76. package/es/components/feature-card/context.js +13 -0
  77. package/es/components/feature-card/index.css.js +655 -0
  78. package/es/components/feature-card/index.js +48 -0
  79. package/es/components/file-preview/data-table/index.js +94 -0
  80. package/es/components/file-preview/data-table/index.module.scss.js +54 -0
  81. package/es/components/file-preview/excel-preview/index.js +132 -0
  82. package/es/components/file-preview/excel-preview/index.module.scss.js +11 -0
  83. package/es/components/file-preview/excel-preview/utils.js +46 -0
  84. package/es/components/file-preview/img-preview/index.js +18 -0
  85. package/es/components/file-preview/img-preview/index.module.scss.js +17 -0
  86. package/es/components/file-preview/index.js +124 -0
  87. package/es/components/file-preview/index.module.scss.js +32 -0
  88. package/es/components/file-preview/json-preview/index.js +166 -0
  89. package/es/components/file-preview/markdown-preview/index.js +53 -0
  90. package/es/components/file-preview/markdown-preview/index.module.scss.js +1055 -0
  91. package/es/components/file-preview/parquet-preview/index.js +54 -0
  92. package/es/components/file-preview/pdf-preview/index.js +215 -0
  93. package/es/components/file-preview/pdf-preview/index.module.scss.js +16 -0
  94. package/es/components/file-preview/table-preview/index.js +43 -0
  95. package/es/components/file-preview/table-preview/index.module.scss.js +11 -0
  96. package/es/components/file-preview/txt-preview/index.js +24 -0
  97. package/es/components/file-preview/util.js +94 -0
  98. package/es/components/file-uploader/components/circle-progress.css.js +39 -0
  99. package/es/components/file-uploader/components/circle-progress.js +12 -0
  100. package/es/components/file-uploader/components/hooks/use-drop-zone.js +74 -0
  101. package/es/components/file-uploader/components/hooks/use-file-validation.js +52 -0
  102. package/es/components/file-uploader/components/icons.js +19 -0
  103. package/es/components/file-uploader/components/theme.css.js +64 -0
  104. package/es/components/file-uploader/components/uploader-drop-zone.css.js +66 -0
  105. package/es/components/file-uploader/components/uploader-drop-zone.js +74 -0
  106. package/es/components/file-uploader/components/uploader-file-item.css.js +186 -0
  107. package/es/components/file-uploader/components/uploader-file-item.js +63 -0
  108. package/es/components/file-uploader/components/uploader-file-list.css.js +43 -0
  109. package/es/components/file-uploader/components/uploader-file-list.js +27 -0
  110. package/es/components/file-uploader/components/uploader.css.js +20 -0
  111. package/es/components/file-uploader/components/uploader.js +51 -0
  112. package/es/components/file-uploader/components/uploading-status.css.js +52 -0
  113. package/es/components/file-uploader/components/uploading-status.js +54 -0
  114. package/es/components/file-uploader/components/utils/directory-reader.js +65 -0
  115. package/es/components/file-uploader/constants.js +31 -0
  116. package/es/components/file-uploader/context/action-registry.js +69 -0
  117. package/es/components/file-uploader/context/file-state-store.js +83 -0
  118. package/es/components/file-uploader/context/handler-registry.js +119 -0
  119. package/es/components/file-uploader/context/upload-context.js +36 -0
  120. package/es/components/file-uploader/context/upload-provider.js +77 -0
  121. package/es/components/file-uploader/context/upload-reducer.js +21 -0
  122. package/es/components/file-uploader/context/use-upload-engine.js +440 -0
  123. package/es/components/file-uploader/engine/queue-callbacks.js +257 -0
  124. package/es/components/file-uploader/engine/queue-manager.js +195 -0
  125. package/es/components/file-uploader/engine/queue-uploader.js +25 -0
  126. package/es/components/file-uploader/hooks/use-upload.js +327 -0
  127. package/es/components/file-uploader/utils/chunk-handlers.js +66 -0
  128. package/es/components/file-uploader/utils/ensure-handlers.js +53 -0
  129. package/es/components/file-uploader/utils/error-handler.js +84 -0
  130. package/es/components/file-uploader/utils/upload-controllers.js +43 -0
  131. package/es/components/file-uploader/utils/upload-handler.js +68 -0
  132. package/es/components/file-uploader/utils/validate-handlers.js +16 -0
  133. package/es/components/floating-label-input/index.js +46 -0
  134. package/es/components/floating-label-input/index.module.scss.js +30 -0
  135. package/es/components/floating-layer/index.js +15 -0
  136. package/es/components/floating-layer/index.scss.js +31 -0
  137. package/es/components/header/index.js +10 -0
  138. package/es/components/header/index.module.scss.js +16 -0
  139. package/es/components/input-tag/index.js +65 -0
  140. package/es/components/menu/index.js +96 -0
  141. package/es/components/menu/index.module.scss.js +188 -0
  142. package/es/components/model-card/index.js +20 -0
  143. package/es/components/model-card/index.module.scss.js +116 -0
  144. package/es/components/notion-editor/code-block/index.js +18 -0
  145. package/es/components/notion-editor/code-block/languageDetector.js +134 -0
  146. package/es/components/notion-editor/code-block/languages.js +42 -0
  147. package/es/components/notion-editor/index.js +258 -0
  148. package/es/components/notion-editor/index.scss.js +421 -0
  149. package/es/components/notion-editor/parseMarkdown.js +184 -0
  150. package/es/components/operator-chain/components/AddButton.js +20 -0
  151. package/es/components/operator-chain/components/IOCard.js +8 -0
  152. package/es/components/operator-chain/components/SingleCard.js +12 -0
  153. package/es/components/operator-chain/components/VirtualDropdown.js +56 -0
  154. package/es/components/operator-chain/index.js +83 -0
  155. package/es/components/operator-chain/index.module.scss.js +232 -0
  156. package/es/components/permission-editor/index.js +9 -0
  157. package/es/components/permission-editor/permissionEditModal/index.js +37 -0
  158. package/es/components/permission-editor/permissionEditor/index.js +253 -0
  159. package/es/components/permission-editor/permissionEditor/index.module.scss.js +22 -0
  160. package/es/components/permission-editor/permissionViewPopover/index.js +9 -0
  161. package/es/components/popover-select/index.js +42 -0
  162. package/es/components/popover-select/index.module.scss.js +22 -0
  163. package/es/components/radio-card/index.js +24 -0
  164. package/es/components/radio-card/index.scss.js +58 -0
  165. package/es/components/section-heading/classNames.js +22 -0
  166. package/es/components/section-heading/components.js +27 -0
  167. package/es/components/section-heading/context.js +13 -0
  168. package/es/components/section-heading/index.css.js +648 -0
  169. package/es/components/section-heading/index.js +37 -0
  170. package/es/components/status-tag/index.js +31 -0
  171. package/es/components/tag-group-filter/dataSizeFilter.js +100 -0
  172. package/es/components/tag-group-filter/index.js +53 -0
  173. package/es/components/tag-group-filter/index.module.scss.js +134 -0
  174. package/es/components/tag-group-filter/tagFilter.js +19 -0
  175. package/es/components/tag-view/index.js +138 -0
  176. package/es/components/tag-view/index.module.scss.js +56 -0
  177. package/es/components/tag-view/useSize.js +41 -0
  178. package/es/components/tip-tap/bubble-menu.js +47 -0
  179. package/es/components/tip-tap/editor.js +34 -0
  180. package/es/components/tip-tap/extensions/index.js +133 -0
  181. package/es/components/tip-tap/extensions/markdown-paste.js +148 -0
  182. package/es/components/tip-tap/icons/index.js +29 -0
  183. package/es/components/tip-tap/reader.js +15 -0
  184. package/es/components/tip-tap/styles/editor.css.js +863 -0
  185. package/es/components/tip-tap/toolbar/components/color-picker.js +76 -0
  186. package/es/components/tip-tap/toolbar/components/heading-dropdown.js +44 -0
  187. package/es/components/tip-tap/toolbar/components/image-button.js +26 -0
  188. package/es/components/tip-tap/toolbar/components/link-button.js +107 -0
  189. package/es/components/tip-tap/toolbar/components/table-button.js +37 -0
  190. package/es/components/tip-tap/toolbar/components/toolbar-button.js +7 -0
  191. package/es/components/tip-tap/toolbar/index.js +39 -0
  192. package/es/components/uploadDrawer/UploadStoreProvider.js +61 -0
  193. package/es/components/uploadDrawer/fileUploadDrawer.js +66 -0
  194. package/es/components/uploadDrawer/fileUploadDrawerFileDragger.js +71 -0
  195. package/es/components/uploadDrawer/fileUploadDrawerList.js +54 -0
  196. package/es/components/uploadDrawer/fileUploadDrawerListProgressButton.js +54 -0
  197. package/es/components/uploadDrawer/hooks/useCancelUpload.js +37 -0
  198. package/es/components/uploadDrawer/hooks/useFilterFiles.js +107 -0
  199. package/es/components/uploadDrawer/hooks/useFinishUpload.js +33 -0
  200. package/es/components/uploadDrawer/hooks/useFormatFiles.js +54 -0
  201. package/es/components/uploadDrawer/hooks/useProgressButtonRef.js +22 -0
  202. package/es/components/uploadDrawer/hooks/useRemoveFilesInUploadQueue.js +21 -0
  203. package/es/components/uploadDrawer/hooks/useResumeUnfinishedUploads.js +52 -0
  204. package/es/components/uploadDrawer/hooks/useRetryUpload.js +35 -0
  205. package/es/components/uploadDrawer/hooks/useSaveUnfinishedUploads.js +42 -0
  206. package/es/components/uploadDrawer/hooks/useSetupUpload.js +80 -0
  207. package/es/components/uploadDrawer/hooks/useUploadFileToOSS.js +23 -0
  208. package/es/components/uploadDrawer/index.css.js +511 -0
  209. package/es/components/uploadDrawer/index.js +43 -0
  210. package/es/components/uploadDrawer/utils/calcDisplaySize.js +19 -0
  211. package/es/components/uploadDrawer/utils/constant.js +16 -0
  212. package/es/components/uploadDrawer/utils/createFileToUpload.js +51 -0
  213. package/es/components/uploadDrawer/utils/fileDB/deleteFileInStore.js +28 -0
  214. package/es/components/uploadDrawer/utils/fileDB/deleteObjectStore.js +28 -0
  215. package/es/components/uploadDrawer/utils/fileDB/handleAddFilesToDB.js +37 -0
  216. package/es/components/uploadDrawer/utils/fileDB/index.js +9 -0
  217. package/es/components/uploadDrawer/utils/fileDB/openDB.js +111 -0
  218. package/es/components/uploadDrawer/utils/retrieveAllFiles.js +110 -0
  219. package/es/components/uploadDrawer/utils/shouldCreateNewFile.js +13 -0
  220. package/es/components/uploadDrawer/utils/splitFileIntoChunk.js +15 -0
  221. package/es/index.js +42 -1
  222. package/es/lib/utils.js +8 -0
  223. package/lib/index.js +1 -1
  224. package/package.json +164 -154
  225. package/rollup.es.config.mjs +177 -0
  226. package/tsconfig.rollup.json +7 -0
@@ -0,0 +1,100 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { Select, Flex, InputNumber } from 'antd';
4
+ import { dataSizeFilter, iconTagHeader, iconTagContent, header, iconClear } from './index.module.scss.js';
5
+ import { MinusOutlined } from '@ant-design/icons';
6
+ import iconTagHeader$1 from '../../assets/icon-tag-header.png.js';
7
+
8
+ const { Option } = Select;
9
+ const DATA_SIZE_UNIT = [
10
+ { value: 'kb', name: 'KB' },
11
+ { value: 'mb', name: 'MB' },
12
+ { value: 'gb', name: 'GB' },
13
+ { value: 'tb', name: 'TB' },
14
+ ];
15
+ const transToMB = (value, unit) => {
16
+ switch (unit) {
17
+ case 'kb':
18
+ return value / 1024;
19
+ case 'gb':
20
+ return value * 1024;
21
+ case 'tb':
22
+ return value * 1048576;
23
+ default:
24
+ return value;
25
+ }
26
+ };
27
+ function DataSizeFilter(p) {
28
+ const [startValue, setStartValue] = React.useState(null);
29
+ const [startUnit, setStartUnit] = React.useState('kb');
30
+ const [endValue, setEndValue] = React.useState(null);
31
+ const [endUnit, setEndUnit] = React.useState('kb');
32
+ const startInputRef = React.useRef(null);
33
+ const endInputRef = React.useRef(null);
34
+ const errMsg = React.useMemo(() => {
35
+ let res = '';
36
+ if (startValue !== null &&
37
+ endValue !== null &&
38
+ transToMB(startValue, startUnit) > transToMB(endValue, endUnit)) {
39
+ res = p.isEn ? 'The left value can not greater than the right value' : '左侧数值不能大于右侧数值';
40
+ }
41
+ return res;
42
+ }, [startValue, startUnit, endValue, endUnit, p.isEn]);
43
+ const handleClear = (e) => {
44
+ e.stopPropagation();
45
+ p.onChange(['', '']);
46
+ };
47
+ const handleChange = (param) => {
48
+ const obj = Object.assign({ startValue, startUnit, endValue, endUnit }, param);
49
+ if (obj.startValue !== null &&
50
+ obj.endValue !== null &&
51
+ transToMB(obj.startValue, obj.startUnit) > transToMB(obj.endValue, obj.endUnit)) {
52
+ return;
53
+ }
54
+ p.onChange([
55
+ obj.startValue === null || obj.startValue === undefined ? '' : `${obj.startValue}${obj.startUnit}`,
56
+ obj.endValue === null || obj.endValue === undefined ? '' : `${obj.endValue}${obj.endUnit}`,
57
+ ]);
58
+ };
59
+ const handleStartValueChange = (value) => {
60
+ setStartValue(value);
61
+ };
62
+ const handleStartUnitChange = (value) => {
63
+ setStartUnit(value);
64
+ if (startValue !== null) {
65
+ handleChange({ startUnit: value });
66
+ }
67
+ };
68
+ const handleEndValueChange = (value) => {
69
+ setEndValue(value);
70
+ };
71
+ const handleEndUnitChange = (value) => {
72
+ setEndUnit(value);
73
+ if (endValue !== null) {
74
+ handleChange({ endUnit: value });
75
+ }
76
+ };
77
+ const handleStartPressEnter = () => {
78
+ var _a;
79
+ (_a = startInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
80
+ };
81
+ const handleEndPressEnter = () => {
82
+ var _a;
83
+ (_a = endInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
84
+ };
85
+ const handleStartBlur = () => {
86
+ handleChange({ startValue });
87
+ };
88
+ const handleEndBlur = () => {
89
+ handleChange({ endValue });
90
+ };
91
+ React.useEffect(() => {
92
+ setStartValue(p.value[0] ? +p.value[0].slice(0, -2) : null);
93
+ setStartUnit(p.value[0] ? p.value[0].slice(-2) : 'kb');
94
+ setEndValue(p.value[1] ? +p.value[1].slice(0, -2) : null);
95
+ setEndUnit(p.value[1] ? p.value[1].slice(-2) : 'kb');
96
+ }, [p.value]);
97
+ return (jsxs("div", { className: dataSizeFilter, children: [jsx("span", { className: iconTagHeader, style: { backgroundImage: 'url(' + iconTagHeader$1 + ')' } }), jsx("span", { className: iconTagContent }), jsx(Flex, { justify: "space-between", align: "center", className: header, children: jsxs(Flex, { align: "center", children: [jsx("h3", { children: p.isEn ? 'DataVolume' : '数据体量' }), (startValue !== null || endValue !== null) && (jsx("span", { className: iconClear, onClick: handleClear, children: "\uE85E" }))] }) }), jsxs(Fragment, { children: [jsxs(Flex, { align: "center", children: [jsx(InputNumber, { ref: startInputRef, value: startValue, controls: false, placeholder: p.isEn ? 'Min' : '最小', size: "small", style: { fontSize: 12, width: 140 }, addonAfter: jsx(Select, { style: { width: 50 }, popupMatchSelectWidth: false, value: startUnit, onChange: handleStartUnitChange, children: DATA_SIZE_UNIT.map((item, i) => (jsx(Option, { value: item.value, children: item.name }, i))) }), onChange: handleStartValueChange, onPressEnter: handleStartPressEnter, onBlur: handleStartBlur }), jsx(MinusOutlined, { style: { margin: '0 4px' } }), jsx(InputNumber, { ref: endInputRef, value: endValue, controls: false, placeholder: p.isEn ? 'Max' : '最大', size: "small", style: { fontSize: 12, width: 140 }, addonAfter: jsx(Select, { style: { width: 50 }, popupMatchSelectWidth: false, value: endUnit, onChange: handleEndUnitChange, children: DATA_SIZE_UNIT.map((item, i) => (jsx(Option, { value: item.value, children: item.name }, i))) }), onChange: handleEndValueChange, onPressEnter: handleEndPressEnter, onBlur: handleEndBlur })] }), !!errMsg && jsx("div", { style: { color: 'red', marginTop: 4 }, children: errMsg })] })] }));
98
+ }
99
+
100
+ export { DataSizeFilter as default };
@@ -0,0 +1,53 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import DataSizeFilter from './dataSizeFilter.js';
4
+ import TagFilter from './tagFilter.js';
5
+ import { tagGroupFilter } from './index.module.scss.js';
6
+
7
+ /**
8
+ * 标签组过滤器
9
+ * @param tagGroupDatas 标签组数据
10
+ * @param tagSelected 标签选中状态
11
+ * @param needDataSizeFilter 是否需要数据量过滤(可选)
12
+ * @param dataSizeValue 数据量过滤值(可选)
13
+ * @param isEn 是否英文环境(可选)
14
+ * @param tagClassName 标签类名(可选)
15
+ * @param onTagChange 标签选中状态变化回调
16
+ * @param onDataSizeChange 数据量过滤值变化回调(可选)
17
+ */
18
+ function TagGroupFilter(p) {
19
+ const [menuOpenKeys, setMenuOpenKeys] = React.useState([]);
20
+ const handleTagChange = (key, selected) => {
21
+ const _tagSelected = JSON.parse(JSON.stringify(p.tagSelected));
22
+ _tagSelected[key] = selected;
23
+ p.onTagChange(_tagSelected);
24
+ };
25
+ const handleDataSizeChange = (value) => {
26
+ var _a, _b;
27
+ if (value[0] !== ((_a = p.dataSizeValue) === null || _a === void 0 ? void 0 : _a[0]) || value[1] !== ((_b = p.dataSizeValue) === null || _b === void 0 ? void 0 : _b[1])) {
28
+ p.onDataSizeChange && p.onDataSizeChange(value);
29
+ }
30
+ };
31
+ const handleOpenKeysChange = (key, isFold) => {
32
+ if (isFold) {
33
+ setMenuOpenKeys(menuOpenKeys.filter((v) => v !== key));
34
+ }
35
+ else {
36
+ setMenuOpenKeys([...menuOpenKeys, key]);
37
+ }
38
+ };
39
+ const viewTagGroupDatas = React.useMemo(() => {
40
+ if (p.needDataSizeFilter) {
41
+ const tagGroupDatas = [...p.tagGroupDatas];
42
+ tagGroupDatas.splice(2, 0, { key: 'dataSize', children: [] });
43
+ return tagGroupDatas;
44
+ }
45
+ return p.tagGroupDatas;
46
+ }, [p.tagGroupDatas, p.needDataSizeFilter]);
47
+ React.useEffect(() => {
48
+ setMenuOpenKeys(p.tagGroupDatas.map((item) => item.key));
49
+ }, [p.tagGroupDatas]);
50
+ return (jsx("div", { className: tagGroupFilter, children: viewTagGroupDatas.map((item, index) => (jsx(React.Fragment, { children: item.key === 'dataSize' ? (jsx(DataSizeFilter, { isEn: p.isEn, value: p.dataSizeValue || [], onChange: handleDataSizeChange })) : (jsx(TagFilter, { title: item.title, list: item.children, selected: p.tagSelected[item.key] || [], isFold: !menuOpenKeys.includes(item.key), onChange: (selectd) => handleTagChange(item.key, selectd), onFoldChange: (isFold) => handleOpenKeysChange(item.key, isFold), tagClassName: p.tagClassName }, item.key)) }, index))) }));
51
+ }
52
+
53
+ export { TagGroupFilter as default };
@@ -0,0 +1,134 @@
1
+ var style = document.createElement('style');
2
+ style.textContent = `.index-module__tagGroupFilter___RjT8z {
3
+ padding-bottom: 1px;
4
+ min-height: 100px;
5
+ }
6
+ .index-module__tagGroupFilter___RjT8z .index-module__defaultTagCls___DCei2 {
7
+ background-color: #fff;
8
+ color: #222427;
9
+ cursor: pointer;
10
+ -webkit-user-select: none;
11
+ -moz-user-select: none;
12
+ user-select: none;
13
+ font-family: "Alibaba PuHuiTi 3.0, Alibaba PuHuiTi 30";
14
+ font-size: 14px;
15
+ }
16
+ .index-module__tagGroupFilter___RjT8z .index-module__defaultTagCls___DCei2:hover {
17
+ color: #1775fe;
18
+ background: #e8f1ff;
19
+ }
20
+ .index-module__dataSizeFilter___bc-Rw {
21
+ font-size: 12px;
22
+ margin-bottom: 30px;
23
+ padding-left: 8px;
24
+ position: relative;
25
+ }
26
+ .index-module__dataSizeFilter___bc-Rw .index-module__iconTagHeader___jRKpZ {
27
+ position: absolute;
28
+ top: 3px;
29
+ left: 0;
30
+ display: inline-block;
31
+ width: 3px;
32
+ height: 13px;
33
+ background-size: 3px 13px;
34
+ background-repeat: no-repeat;
35
+ }
36
+ .index-module__dataSizeFilter___bc-Rw .index-module__iconTagContent___g7GGW {
37
+ position: absolute;
38
+ top: 16px;
39
+ left: 0;
40
+ display: inline-block;
41
+ width: 3px;
42
+ height: calc(100% - 16px);
43
+ background-color: #eff0f2;
44
+ }
45
+ .index-module__dataSizeFilter___bc-Rw .index-module__header___BYX3M {
46
+ height: 18px;
47
+ margin-bottom: 20px;
48
+ cursor: pointer;
49
+ }
50
+ .index-module__dataSizeFilter___bc-Rw .index-module__header___BYX3M h3 {
51
+ font-size: 18px;
52
+ line-height: 18px;
53
+ margin: 0;
54
+ font-family: "Alibaba PuHuiTi 3.0, Alibaba PuHuiTi 30";
55
+ color: #222427;
56
+ }
57
+ .index-module__dataSizeFilter___bc-Rw .index-module__header___BYX3M .index-module__iconClear___-lxmF {
58
+ margin-left: 10px;
59
+ font-family: "hub-iconfont";
60
+ font-size: 16px;
61
+ line-height: 16px;
62
+ }
63
+ .index-module__dataSizeFilter___bc-Rw .ant-select-selection-item {
64
+ font-size: 12px;
65
+ }
66
+ .index-module__dataSizeFilter___bc-Rw .ant-input-number-input {
67
+ font-size: 12px;
68
+ }
69
+ .index-module__dataSizeFilter___bc-Rw .ant-select-selector {
70
+ padding: 0 4px !important;
71
+ }
72
+ .index-module__dataSizeFilter___bc-Rw .ant-input-number-group-addon {
73
+ padding: 0 2px 0 10px;
74
+ }
75
+ .index-module__tagFilter___50Ybi {
76
+ margin-bottom: 30px;
77
+ padding-left: 8px;
78
+ position: relative;
79
+ }
80
+ .index-module__tagFilter___50Ybi .index-module__iconTagHeader___jRKpZ {
81
+ position: absolute;
82
+ top: 3px;
83
+ left: 0;
84
+ display: inline-block;
85
+ width: 3px;
86
+ height: 13px;
87
+ background-size: 3px 13px;
88
+ background-repeat: no-repeat;
89
+ }
90
+ .index-module__tagFilter___50Ybi .index-module__iconTagContent___g7GGW {
91
+ position: absolute;
92
+ top: 16px;
93
+ left: 0;
94
+ display: inline-block;
95
+ width: 3px;
96
+ height: calc(100% - 16px);
97
+ background-color: #eff0f2;
98
+ }
99
+ .index-module__tagFilter___50Ybi .index-module__header___BYX3M {
100
+ height: 18px;
101
+ margin-bottom: 20px;
102
+ cursor: pointer;
103
+ }
104
+ .index-module__tagFilter___50Ybi .index-module__header___BYX3M h3 {
105
+ font-size: 18px;
106
+ line-height: 18px;
107
+ margin: 0;
108
+ font-family: "Alibaba PuHuiTi 3.0, Alibaba PuHuiTi 30";
109
+ color: #222427;
110
+ }
111
+ .index-module__tagFilter___50Ybi .index-module__header___BYX3M .index-module__iconClear___-lxmF {
112
+ margin-left: 10px;
113
+ font-family: "hub-iconfont";
114
+ font-size: 16px;
115
+ line-height: 16px;
116
+ }
117
+ .index-module__tagFilter___50Ybi .index-module__header___BYX3M .index-module__iconArrow___4p7Zy {
118
+ color: #545b64;
119
+ font-size: 12px;
120
+ }
121
+ .index-module__tagFilter___50Ybi .index-module__subTitle___5vrhh {
122
+ color: #87909e;
123
+ font-size: 14px;
124
+ line-height: 14px;
125
+ margin: 20px 0 10px 0;
126
+ min-height: 1px;
127
+ font-family: "Alibaba PuHuiTi 3.0, Alibaba PuHuiTi 30";
128
+ font-weight: 600;
129
+ }`;
130
+ document.head.appendChild(style);
131
+
132
+ var tagGroupFilter = "index-module__tagGroupFilter___RjT8z";var dataSizeFilter = "index-module__dataSizeFilter___bc-Rw";var iconTagHeader = "index-module__iconTagHeader___jRKpZ";var iconTagContent = "index-module__iconTagContent___g7GGW";var header = "index-module__header___BYX3M";var iconClear = "index-module__iconClear___-lxmF";var tagFilter = "index-module__tagFilter___50Ybi";var iconArrow = "index-module__iconArrow___4p7Zy";var subTitle = "index-module__subTitle___5vrhh";
133
+
134
+ export { dataSizeFilter, header, iconArrow, iconClear, iconTagContent, iconTagHeader, subTitle, tagFilter, tagGroupFilter };
@@ -0,0 +1,19 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { Flex } from 'antd';
3
+ import { tagFilter, iconTagHeader, iconTagContent, header, iconClear, iconArrow, subTitle } from './index.module.scss.js';
4
+ import TagView from '../tag-view/index.js';
5
+ import { CaretRightOutlined, CaretDownOutlined } from '@ant-design/icons';
6
+ import iconTagHeader$1 from '../../assets/icon-tag-header.png.js';
7
+
8
+ function TagFilter(p) {
9
+ const handleClear = (e) => {
10
+ e.stopPropagation();
11
+ p.onChange([]);
12
+ };
13
+ return (jsxs("div", { className: tagFilter, children: [p.title !== undefined && (jsxs(Fragment, { children: [jsx("span", { className: iconTagHeader, style: { backgroundImage: 'url(' + iconTagHeader$1 + ')' } }), !p.isFold && jsx("span", { className: iconTagContent })] })), p.title !== undefined && (jsxs(Flex, { justify: "space-between", align: "center", className: header, onClick: () => p.onFoldChange(!p.isFold), children: [jsxs(Flex, { align: "center", children: [jsx("h3", { children: p.title }), !p.isFold && p.selected.length > 0 && (jsx("span", { className: iconClear, onClick: handleClear, children: "\uE85E" }))] }), !p.hideFoldIcon && (jsx(Fragment, { children: p.isFold ? (jsx("span", { className: iconArrow, children: jsx(CaretRightOutlined, {}) })) : (jsx("span", { className: iconArrow, children: jsx(CaretDownOutlined, {}) })) }))] })), !p.isFold &&
14
+ p.list
15
+ .filter((item) => item.children.length > 0)
16
+ .map((item, i) => (jsxs("div", { children: [item.subTitle !== undefined && jsx("div", { className: subTitle, children: item.subTitle }), jsx(TagView, { list: item.children, maxLine: item.subTitle ? 2 : 3, selected: p.selected, onChange: p.onChange, tagClassName: p.tagClassName })] }, i)))] }));
17
+ }
18
+
19
+ export { TagFilter as default };
@@ -0,0 +1,138 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Space, Tag, Tooltip } from 'antd';
3
+ import { useRef, useState, useMemo, useCallback, useEffect } from 'react';
4
+ import { EllipsisOutlined } from '@ant-design/icons';
5
+ import { tagView, checkedTag, defaultTag2, defaultTag } from './index.module.scss.js';
6
+ import useSize from './useSize.js';
7
+
8
+ const lineHeight = 22;
9
+ const rowGap = 8;
10
+ const tagGap = 8;
11
+ const ellipsisWidth = 44;
12
+ function showMarkDom(str) {
13
+ if (!str) {
14
+ return '';
15
+ }
16
+ const res = [];
17
+ let key = 0;
18
+ str.split('<mark>').forEach((item) => {
19
+ const arr = item.split('</mark>');
20
+ if (arr.length > 1) {
21
+ res.push(jsx("mark", { children: arr[0] }, key++));
22
+ res.push(jsx("span", { children: arr[1] }, key++));
23
+ }
24
+ else {
25
+ res.push(jsx("span", { children: arr[0] }, key++));
26
+ }
27
+ });
28
+ return res;
29
+ }
30
+ function TagViewInner(p) {
31
+ const { list = [], maxLine = 1, needTooltip = false, selected, tagClassName } = p;
32
+ const spaceRef = useRef(null);
33
+ const [isOverflow, setIsOverflow] = useState(false); // 标签是否超出了容器
34
+ const [breakIndex, setBreakIndex] = useState(0);
35
+ const [tagWidths, setTagWidths] = useState([]);
36
+ const { width: spaceWidth } = useSize(spaceRef.current);
37
+ const canSelect = useMemo(() => Boolean(selected), [selected]);
38
+ const names = useMemo(() => list.map((item) => item.name).join(''), [list]);
39
+ const isFold = needTooltip;
40
+ const handleChange = (value, checked) => {
41
+ let newSelected = [];
42
+ if (checked) {
43
+ newSelected = [...(selected || []), value];
44
+ }
45
+ else {
46
+ newSelected = (selected || []).filter((v) => v !== value);
47
+ }
48
+ p.onChange && p.onChange(newSelected);
49
+ };
50
+ const calcBreakIndex = useCallback(() => {
51
+ let _breakIndex = 0;
52
+ let _isOverflow = false;
53
+ let curWidth = 0;
54
+ let curLine = 1;
55
+ for (let i = 0; i < tagWidths.length; i++) {
56
+ if (curWidth + tagWidths[i] + tagGap > spaceWidth) {
57
+ if (curLine < maxLine) {
58
+ curLine++;
59
+ curWidth = tagWidths[i] + tagGap;
60
+ }
61
+ else {
62
+ _isOverflow = true;
63
+ if (i > 0 && spaceWidth - curWidth < ellipsisWidth) {
64
+ _breakIndex = i - 1;
65
+ if (_breakIndex > 0 && spaceWidth - curWidth + tagWidths[_breakIndex] + tagGap < ellipsisWidth) {
66
+ _breakIndex--;
67
+ }
68
+ }
69
+ else {
70
+ _breakIndex = i;
71
+ }
72
+ break;
73
+ }
74
+ }
75
+ else {
76
+ curWidth += tagWidths[i] + tagGap;
77
+ }
78
+ }
79
+ setBreakIndex(_breakIndex);
80
+ setIsOverflow(_isOverflow);
81
+ }, [maxLine, tagWidths, spaceWidth]);
82
+ useEffect(() => {
83
+ if (!spaceWidth) {
84
+ return;
85
+ }
86
+ calcBreakIndex();
87
+ // eslint-disable-next-line react-hooks/exhaustive-deps
88
+ }, [maxLine, tagWidths, spaceWidth]);
89
+ useEffect(() => {
90
+ var _a;
91
+ // 如果list为空数组,spaceRef.current是null
92
+ const tagDoms = spaceRef.current.querySelectorAll('.label');
93
+ const _tagWidths = [];
94
+ for (let i = 0; i < list.length; i++) {
95
+ _tagWidths.push((_a = tagDoms[i]) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().width);
96
+ }
97
+ setTagWidths(_tagWidths);
98
+ }, [names, list.length]);
99
+ return (jsxs(Space, { size: [0, rowGap], wrap: true, ref: spaceRef, style: Object.assign({ maxHeight: isFold ? lineHeight * maxLine + rowGap * (maxLine - 1) + 2 : 'none', overflow: 'hidden' }, p.style), className: tagView, children: [list.slice(0, breakIndex).map((item) => {
100
+ const checked = (selected || []).includes(item.value);
101
+ return (jsx(Tag, { className: `label ${checked
102
+ ? (tagClassName === null || tagClassName === void 0 ? void 0 : tagClassName.checked) || checkedTag
103
+ : canSelect
104
+ ? (tagClassName === null || tagClassName === void 0 ? void 0 : tagClassName.default) || defaultTag2
105
+ : defaultTag}`, onClick: canSelect ? () => handleChange(item.value, !checked) : undefined, bordered: false, children: showMarkDom(item.name) }, item.value));
106
+ }), isOverflow && needTooltip ? (jsx(Tooltip, { title: list
107
+ .slice(breakIndex)
108
+ .map((item) => (item.name || '').replace(/<mark>/g, '').replace(/<\/mark>/g, ''))
109
+ .join(';'), children: jsx(Tag, { className: defaultTag, bordered: false, children: jsx(EllipsisOutlined, {}) }) })) : (list.slice(breakIndex).map((item) => {
110
+ const checked = (selected || []).includes(item.value);
111
+ return (jsx(Tag, { className: `label ${checked
112
+ ? (tagClassName === null || tagClassName === void 0 ? void 0 : tagClassName.checked) || checkedTag
113
+ : canSelect
114
+ ? (tagClassName === null || tagClassName === void 0 ? void 0 : tagClassName.default) || defaultTag2
115
+ : defaultTag}`, onClick: canSelect ? () => handleChange(item.value, !checked) : undefined, bordered: false, children: showMarkDom(item.name) }, item.value));
116
+ }))] }));
117
+ }
118
+ /**
119
+ * 标签视图
120
+ * @param list 标签列表
121
+ * @param maxLine 最大行数(可选)
122
+ * @param needTooltip 是否需要tooltip(可选)
123
+ * @param selected 选中的标签(可选)
124
+ * @param style 样式(可选)
125
+ * @param onChange 选中状态变化回调(可选)
126
+ * @param tagClassName 标签类名(可选)
127
+ */
128
+ function TagView(p) {
129
+ const { list } = p;
130
+ if (list && list.length > 0) {
131
+ return jsx(TagViewInner, Object.assign({}, p));
132
+ }
133
+ else {
134
+ return jsx("div", {});
135
+ }
136
+ }
137
+
138
+ export { TagView as default };
@@ -0,0 +1,56 @@
1
+ var style = document.createElement('style');
2
+ style.textContent = `.index-module__tagView___7CGfz {
3
+ display: flex;
4
+ }
5
+ .index-module__tagView___7CGfz .index-module__defaultTag___gGS-w {
6
+ background-color: #f4f6fa;
7
+ color: #222427;
8
+ cursor: pointer;
9
+ -webkit-user-select: none;
10
+ -moz-user-select: none;
11
+ user-select: none;
12
+ font-family: "Alibaba PuHuiTi 3.0, Alibaba PuHuiTi 30";
13
+ font-size: 14px;
14
+ }
15
+ .index-module__tagView___7CGfz .index-module__defaultTag2___ICmyv {
16
+ background-color: #f4f6fa;
17
+ color: #222427;
18
+ cursor: pointer;
19
+ -webkit-user-select: none;
20
+ -moz-user-select: none;
21
+ user-select: none;
22
+ font-family: "Alibaba PuHuiTi 3.0, Alibaba PuHuiTi 30";
23
+ font-size: 14px;
24
+ }
25
+ .index-module__tagView___7CGfz .index-module__defaultTag2___ICmyv:hover {
26
+ color: #1775fe;
27
+ background: #e8f1ff;
28
+ }
29
+ .index-module__tagView___7CGfz .index-module__checkedTag___IJjWj {
30
+ background-color: #f4f6fa;
31
+ color: #222427;
32
+ cursor: pointer;
33
+ -webkit-user-select: none;
34
+ -moz-user-select: none;
35
+ user-select: none;
36
+ font-family: "Alibaba PuHuiTi 3.0, Alibaba PuHuiTi 30";
37
+ font-size: 14px;
38
+ background-color: #1775fe;
39
+ color: #fff;
40
+ }
41
+ .index-module__tagView___7CGfz .index-module__foldTag___9mpRP {
42
+ background-color: #f4f6fa;
43
+ color: #222427;
44
+ cursor: pointer;
45
+ -webkit-user-select: none;
46
+ -moz-user-select: none;
47
+ user-select: none;
48
+ font-family: "Alibaba PuHuiTi 3.0, Alibaba PuHuiTi 30";
49
+ font-size: 14px;
50
+ color: #1775fe;
51
+ }`;
52
+ document.head.appendChild(style);
53
+
54
+ var tagView = "index-module__tagView___7CGfz";var defaultTag = "index-module__defaultTag___gGS-w";var defaultTag2 = "index-module__defaultTag2___ICmyv";var checkedTag = "index-module__checkedTag___IJjWj";
55
+
56
+ export { checkedTag, defaultTag, defaultTag2, tagView };
@@ -0,0 +1,41 @@
1
+ import { useState, useLayoutEffect } from 'react';
2
+ import ResizeObserver from 'resize-observer-polyfill';
3
+
4
+ function useSize(target) {
5
+ const getElement = () => {
6
+ if (!target)
7
+ return null;
8
+ if (target instanceof HTMLElement)
9
+ return target;
10
+ return target.current || null;
11
+ };
12
+ const [state, setState] = useState(() => {
13
+ const element = getElement();
14
+ return {
15
+ width: element ? element.clientWidth : 0,
16
+ height: element ? element.clientHeight : 0,
17
+ };
18
+ });
19
+ useLayoutEffect(() => {
20
+ const element = getElement();
21
+ if (!element) {
22
+ return () => { };
23
+ }
24
+ const resizeObserver = new ResizeObserver((entries) => {
25
+ entries.forEach((entry) => {
26
+ setState({
27
+ width: entry.target.clientWidth,
28
+ height: entry.target.clientHeight,
29
+ });
30
+ });
31
+ });
32
+ resizeObserver.observe(element);
33
+ return () => {
34
+ resizeObserver.disconnect();
35
+ };
36
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37
+ }, [typeof target === 'function' ? undefined : target]);
38
+ return state;
39
+ }
40
+
41
+ export { useSize as default };
@@ -0,0 +1,47 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useRef } from 'react';
3
+ import { IconBold, IconItalic, IconUnderline, IconStrikethrough, IconHighlight, IconCheck, IconTrash, IconLink } from './icons/index.js';
4
+
5
+ function TipTapBubbleMenu({ editor }) {
6
+ return (jsxs("div", { className: "tip-tap-bubble-menu", children: [jsx(BubbleButton, { icon: jsx(IconBold, {}), onClick: () => editor.chain().focus().toggleBold().run(), active: editor.isActive('bold'), tooltip: "\u7C97\u4F53" }), jsx(BubbleButton, { icon: jsx(IconItalic, {}), onClick: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive('italic'), tooltip: "\u659C\u4F53" }), jsx(BubbleButton, { icon: jsx(IconUnderline, {}), onClick: () => editor.chain().focus().toggleUnderline().run(), active: editor.isActive('underline'), tooltip: "\u4E0B\u5212\u7EBF" }), jsx(BubbleButton, { icon: jsx(IconStrikethrough, {}), onClick: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive('strike'), tooltip: "\u5220\u9664\u7EBF" }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsx(BubbleButton, { icon: jsx(IconHighlight, {}), onClick: () => editor.chain().focus().toggleHighlight().run(), active: editor.isActive('highlight'), tooltip: "\u9AD8\u4EAE" }), jsx("div", { className: "tip-tap-toolbar__divider" }), jsx(BubbleLinkButton, { editor: editor })] }));
7
+ }
8
+ function BubbleButton({ icon, onClick, active = false, tooltip, }) {
9
+ return (jsx("button", { className: `tip-tap-btn ${active ? 'tip-tap-btn--active' : ''}`, onClick: onClick, type: "button", title: tooltip, children: icon }));
10
+ }
11
+ function BubbleLinkButton({ editor }) {
12
+ const [showInput, setShowInput] = useState(false);
13
+ const [url, setUrl] = useState('');
14
+ const inputRef = useRef(null);
15
+ function handleOpenInput() {
16
+ const currentUrl = editor.getAttributes('link').href || '';
17
+ setUrl(currentUrl);
18
+ setShowInput(true);
19
+ queueMicrotask(() => {
20
+ var _a;
21
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
22
+ });
23
+ }
24
+ function handleSubmit() {
25
+ if (url) {
26
+ editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();
27
+ }
28
+ setShowInput(false);
29
+ setUrl('');
30
+ }
31
+ function handleRemove() {
32
+ editor.chain().focus().unsetLink().run();
33
+ setShowInput(false);
34
+ setUrl('');
35
+ }
36
+ if (showInput) {
37
+ return (jsxs("div", { className: "tip-tap-link-popup", style: { boxShadow: 'none', border: 'none', padding: 0, margin: 0 }, children: [jsx("input", { ref: inputRef, type: "text", className: "tip-tap-link-popup__input", style: { width: '160px', padding: '4px 8px', fontSize: '13px' }, placeholder: "\u8F93\u5165\u94FE\u63A5...", value: url, onChange: (e) => setUrl(e.target.value), onKeyDown: (e) => {
38
+ if (e.key === 'Enter')
39
+ handleSubmit();
40
+ if (e.key === 'Escape')
41
+ setShowInput(false);
42
+ } }), jsx("button", { className: "tip-tap-btn", onClick: handleSubmit, type: "button", style: { width: '24px', height: '24px' }, children: jsx(IconCheck, {}) }), editor.isActive('link') && (jsx("button", { className: "tip-tap-btn", onClick: handleRemove, type: "button", style: { width: '24px', height: '24px', color: '#dc2626' }, children: jsx(IconTrash, {}) }))] }));
43
+ }
44
+ return (jsx(BubbleButton, { icon: jsx(IconLink, {}), onClick: handleOpenInput, active: editor.isActive('link'), tooltip: "\u94FE\u63A5" }));
45
+ }
46
+
47
+ export { TipTapBubbleMenu as default };
@@ -0,0 +1,34 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useEditor, EditorContent } from '@tiptap/react';
3
+ import { BubbleMenu } from '@tiptap/react/menus';
4
+ import { forwardRef, useImperativeHandle } from 'react';
5
+ import { editorExtensions } from './extensions/index.js';
6
+ import Toolbar from './toolbar/index.js';
7
+ import TipTapBubbleMenu from './bubble-menu.js';
8
+
9
+ var editor = forwardRef(function TipTapEditor({ content = '', placeholder = '开始输入内容...', editable = true, autofocus = false, className = '', toolbarClassName = '', onChange, }, ref) {
10
+ const editor = useEditor({
11
+ extensions: editorExtensions(placeholder),
12
+ content,
13
+ editable,
14
+ autofocus,
15
+ immediatelyRender: true,
16
+ onUpdate: ({ editor }) => {
17
+ onChange === null || onChange === void 0 ? void 0 : onChange(editor.getHTML());
18
+ },
19
+ });
20
+ useImperativeHandle(ref, () => ({
21
+ getContent: () => { var _a; return (_a = editor === null || editor === void 0 ? void 0 : editor.getHTML()) !== null && _a !== void 0 ? _a : ''; },
22
+ getJSON: () => { var _a; return (_a = editor === null || editor === void 0 ? void 0 : editor.getJSON()) !== null && _a !== void 0 ? _a : {}; },
23
+ getMarkdown: () => { var _a; return (_a = editor === null || editor === void 0 ? void 0 : editor.getMarkdown()) !== null && _a !== void 0 ? _a : ''; },
24
+ setContent: (content) => editor === null || editor === void 0 ? void 0 : editor.commands.setContent(content),
25
+ setMarkdown: (markdown) => editor === null || editor === void 0 ? void 0 : editor.commands.setContent(markdown, { contentType: 'markdown' }),
26
+ focus: () => editor === null || editor === void 0 ? void 0 : editor.commands.focus(),
27
+ isEmpty: () => { var _a; return (_a = editor === null || editor === void 0 ? void 0 : editor.isEmpty) !== null && _a !== void 0 ? _a : true; },
28
+ }));
29
+ return (jsxs("div", { className: `tip-tap-editor ${className}`, children: [editor && editable && (jsxs(Fragment, { children: [jsx(Toolbar, { editor: editor, className: toolbarClassName }), jsx(BubbleMenu, { editor: editor, options: {
30
+ placement: 'top',
31
+ }, children: jsx(TipTapBubbleMenu, { editor: editor }) })] })), jsx(EditorContent, { editor: editor, className: "tip-tap-editor__content" })] }));
32
+ });
33
+
34
+ export { editor as default };